home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BBS Toolkit
/
BBS Toolkit.iso
/
programs
/
se401a.zip
/
SE400.DOC
< prev
next >
Wrap
Text File
|
1992-05-12
|
1MB
|
28,878 lines
OSIRIS SE Rev 4.01
Copyright (c) 1988, 89, 90, 91, 92
By
International TeleCommunications
ALL RIGHTS RESERVED
1 314 334-6359 CBIS
1 314 335-5384 VOICE
DOCUMENT VERSION 15.00
May 12, 1992
Table of Contents
i
Warranty .................................................. Page 1
Copyright ................................................. Page 1
Hardware Requirements ..................................... Page 2
Archive Contents, Exe's ................................... Page 2
Zmodem.exe ............................................. Page 3
Ymodem.exe ............................................. Page 3
Xmodem.exe ............................................. Page 3
Chksum.exe ............................................. Page 3
Index.exe .............................................. Page 3
Mmu.exe ................................................ Page 3
Ovl01818.exe ........................................... Page 3
Bullgen.exe ............................................ Page 3
Confile.exe ............................................ Page 3
Fam.exe ................................................ Page 3
Cat.exe ................................................ Page 3
Sphinx.exe ............................................. Page 3
Ulink.exe .............................................. Page 3
Osm.exe ................................................ Page 3
Osiris.exe ............................................. Page 3
Imx.exe ................................................ Page 3
Readarc.exe ............................................ Page 3
Export.exe ............................................. Page 4
Import.exe ............................................. Page 4
Traffic.exe ............................................ Page 4
Event.exe .............................................. Page 4
Scan.exe ............................................... Page 4
Osetup.exe ............................................. Page 4
User.exe ............................................... Page 4
Ovl01819.exe ........................................... Page 4
Mkpost.exe ............................................. Page 4
Itc.exe ................................................ Page 4
Itlink.exe ............................................. Page 4
Memo.exe ............................................... Page 4
Cmds.dat ............................................... Page 4
Ascii.txt .............................................. Page 4
Cmdmake.exe ............................................ Page 4
Lankey.exe ............................................. Page 4
Setlock.exe ............................................ Page 4
Test-Drive Mode ........................................... Page 4
Introduction .............................................. Page 5
Not Just A Bbs Program ................................. Page 5
Cost ................................................... Page 5
Set Up .................................................... Page 6
Important Information .................................. Page 6
Local Testing ............................................. Page 7
Reboot First ........................................... Page 7
On-Line Testing ........................................... Page 7
Menus ..................................................... Page 7
Beginners Menus ........................................ Page 7
Slightly Advanced Menus ................................ Page 9
Table of Contents
ii
Odds And Ends ............................................. Page 10
Environment Variable ................................... Page 10
Spl/I .................................................. Page 10
Main Menu ................................................. Page 10
Conference Area ........................................ Page 11
File Area .............................................. Page 11
Log Off ................................................ Page 11
User Status ............................................ Page 12
Bulletin ............................................... Page 12
Page You ............................................... Page 12
Change Set-Up .......................................... Page 13
Version ................................................ Page 13
Who Is On-Line ......................................... Page 14
Message Center ......................................... Page 14
[I]ndividual ........................................ Page 15
[T]hread ............................................ Page 15
File Attaches ....................................... Page 15
Download ............................................... Page 16
User List .............................................. Page 16
Store .................................................. Page 16
Statistics Subsystem ................................... Page 17
Todays Callers ...................................... Page 17
Who Called Yesterday ................................ Page 17
Caller History ...................................... Page 17
Six Best Times To Call .............................. Page 17
Six Worse Times To Call ............................. Page 18
Quirk ............................................ Page 18
Top Ten Uploaders ................................... Page 18
Baud Rate Chart ..................................... Page 18
Top Ten Downloads ................................... Page 18
Protocol Graph ...................................... Page 18
Top Ten Dnloaders ................................... Page 18
Track Call History .................................. Page 19
Specific History Date ............................... Page 20
Track Individual .................................... Page 20
Total And Avg In-Use ................................ Page 20
Top Ten Callers To The System ....................... Page 20
Top Ten Message Posters ............................. Page 21
File Area Statistics ................................ Page 21
Advanced Mailer/Remote Tnt .......................... Page 21
Inter Node Mail Room ................................... Page 21
User Defined Functions ................................. Page 22
Adding Conference Message Areas ........................... Page 23
Area Name .............................................. Page 23
Fragmented Area Numbers ............................. Page 23
Area Access Level ...................................... Page 23
Area Flag Settings ..................................... Page 23
Flags, How They Work ................................ Page 24
General Propose Flags ............................ Page 24
Area Flags ....................................... Page 24
Table of Contents
iii
Board Type ............................................. Page 25
Local ............................................... Page 25
Echo ................................................ Page 25
Echo/Pass ........................................... Page 25
Message Type ........................................... Page 25
Asp ................................................. Page 25
Asp/Alias ........................................... Page 25
Rev ................................................. Page 26
Mod.ctl .......................................... Page 26
Rev/Alias ........................................... Page 26
Origin Line ............................................ Page 26
Full Help Menu Name .................................... Page 26
Pack Trigger Level ..................................... Page 27
Pack Level ............................................. Page 27
Word Wrap .............................................. Page 27
Functions .............................................. Page 27
Area Change ......................................... Page 27
Log Off ............................................. Page 28
New Mail ............................................ Page 28
Enter ............................................... Page 28
Main ................................................ Page 28
Confer. ............................................. Page 29
Text ................................................ Page 29
Gateway ............................................. Page 29
Pack ................................................ Page 29
Bug? . . . No .................................... Page 30
File Areas .......................................... Page 30
Message Center ...................................... Page 30
[R]ead Command ...................................... Page 30
[M]ask ........................................... Page 31
[T]o ............................................. Page 31
[F]rom ........................................... Page 32
[A]ll ............................................ Page 32
[P]attern ........................................ Page 32
[L]ast Read ...................................... Page 33
Searching For Specific Messages .................. Page 33
[T]hread ......................................... Page 33
Default.msg ............................................ Page 34
Final Step ............................................. Page 34
Matrix(?) ................................................. Page 35
Osage ..................................................... Page 35
Ascii Uploading Into Messages ............................. Page 36
Rules .................................................. Page 36
Hard Carriage Returns .................................. Page 36
Line Editor ............................................... Page 38
Message Handling Or Message Base Format ................... Page 38
Fido Style ............................................ Page 38
Hudson ................................................. Page 38
The Answer ............................................. Page 39
Table of Contents
iv
Fidonet Style Echomail .................................... Page 39
Export ................................................. Page 40
Command Line ........................................ Page 40
/S ............................................... Page 40
/R ............................................... Page 40
/N ............................................... Page 40
/F ............................................... Page 40
/M ............................................... Page 40
/A ............................................... Page 40
/X ............................................... Page 40
/O ............................................... Page 40
/C ............................................... Page 41
/? ............................................... Page 41
Setting Up Export.ctl For Outbound Echomail ............ Page 41
Support Path ........................................ Page 41
Add Listing ......................................... Page 41
Enter Area Name ..................................... Page 42
Determine Archiving Method .......................... Page 42
Get Network Address ................................. Page 43
Determine Priority .................................. Page 43
Avoiding Echomail Errors ............................ Page 44
Config.sys .......................................... Page 45
Import.log .......................................... Page 46
Exporting And Multiple Line Systems ................. Page 46
Import ................................................. Page 47
Dups ................................................ Page 48
Backup System .................................... Page 48
Import's Echo.ctl File .............................. Page 48
Sample Echo.ctl ..................................... Page 49
Common Error ........................................ Page 49
Import Em Cache ..................................... Page 50
Cache Statistics ................................. Page 50
Disk Space ............................................. Page 50
Speed Tips ............................................. Page 51
Halcyon.cfg ............................................ Page 51
Use Ems ............................................. Page 52
Bypass Security ..................................... Page 52
Max Cache Size ...................................... Page 53
Ems Handles, Very Important ...................... Page 53
No Em Cache ......................................... Page 53
Maximum Memory ...................................... Page 53
Matrix Address ...................................... Page 53
Common Mistake ................................... Page 54
Tear Line ........................................... Page 54
Point Net ........................................... Page 54
Htms Address ........................................ Page 54
Archive Directory ................................... Page 54
Msg Format .......................................... Page 54
Outbound Msg Directory .............................. Page 55
Inbound File Path ................................... Page 55
Table of Contents
v
Pkt Temp Storage .................................... Page 55
Dup.dat Storage ..................................... Page 55
Max Systems ......................................... Page 55
Unknown Save Area ................................... Page 56
Matrix Ending Up Here ............................ Page 56
Formatting .......................................... Page 57
Echo/Pass .............................................. Page 57
Seen By Lines .......................................... Page 57
Quad Already Seen System ............................... Page 57
Origin Lines ........................................... Page 57
Databases .............................................. Page 58
Error Reading/Writing Record 0 ......................... Page 58
Traffic.exe ............................................ Page 58
Readarc.exe ............................................ Page 58
Ulink .................................................. Page 59
Sphinx! ................................................... Page 59
Display.dat ............................................ Page 60
Message Center ......................................... Page 63
Print Current Message To A Text File ................ Page 63
Print Current Message To Printer .................... Page 63
Conference Message Areas ............................ Page 63
List Headers ........................................ Page 64
Mark ................................................ Page 65
Restore ............................................. Page 65
Search .............................................. Page 65
Broadcast ........................................... Page 66
Edit Current ........................................ Page 67
Jumping To A Specific Message ....................... Page 67
Set Personal Msg Pointers ........................... Page 67
Conference Message Areas ............................... Page 68
Moderator ........................................... Page 68
Mass Print .......................................... Page 68
Change Area ......................................... Page 69
Mark ................................................ Page 69
Restore ............................................. Page 69
Search .............................................. Page 69
Forward Conference .................................. Page 70
Forward Message Center .............................. Page 70
Jumping To A Specific Message ....................... Page 70
Marking Received .................................... Page 71
Set Personal Msg Pointers ........................... Page 71
Set Unread Msg Pointers ............................. Page 71
Tag Line ............................................ Page 71
Screen Clip ......................................... Page 72
Dc Word(tm) ............................................ Page 73
Commands ............................................ Page 73
F1 - Calculator ..................................... Page 76
F2 - Text Viewer .................................... Page 76
Alt-D Dictionary .................................... Page 76
Alt-J Jump To Dos ................................... Page 76
Table of Contents
vi
Ctrl-B Reformat ..................................... Page 77
Alt-I Import File ................................... Page 77
Alt-S, Cursive Signature ............................ Page 77
Mouse Menu .......................................... Page 78
Cut/Paste ........................................... Page 78
Cut ................................................. Page 78
Paste ............................................... Page 79
Quick Jump .......................................... Page 79
Macro Keys .......................................... Page 79
Color .................................................. Page 81
File Subsystem ............................................ Page 82
Upload/Download File(s) ................................ Page 82
Files.idx ........................................... Page 82
Files.dat ........................................... Page 82
Dl_area.idx ......................................... Page 82
Wildcard Characters .................................... Page 83
Advantages ............................................. Page 83
Disadvantage ........................................... Page 83
File Queue ............................................. Page 83
Defining A File Area ...................................... Page 83
Area Name .............................................. Page 84
Access Level ........................................... Page 84
Area Access Flags ...................................... Page 84
Download Path .......................................... Page 84
Download Files.qbs ..................................... Page 84
Cd-Rom Or Worm Drives ............................... Page 85
File Not Found, But It Exists! ...................... Page 85
Upload Path ............................................ Page 85
The Help Menu .......................................... Page 85
Dnl Files Name ......................................... Page 86
Upl Files Name ......................................... Page 86
Free Download Area ..................................... Page 86
Application Flags ...................................... Page 86
Command Key Options .................................... Page 87
Area Change ......................................... Page 87
Alternate Area Listing ........................... Page 87
Log Off ............................................. Page 88
File Search ......................................... Page 88
Kill ................................................ Page 88
Main Menu ........................................... Page 88
Quick File List ..................................... Page 88
Full File List ...................................... Page 89
List In Reverse Order ............................ Page 89
List Mask ........................................ Page 89
Upload .............................................. Page 90
File Duplication System .......................... Page 91
Badfiles.bbs ..................................... Page 91
(G)oodbye After Batch, (A)bort, Or (S)tart Transfer . Page 92
Archive Integrity Check .......................... Page 92
Virus Check ...................................... Page 92
Table of Contents
vii
Download ............................................ Page 93
File Ratio Limits ................................ Page 93
Kilo-Byte Ratio Limits ........................... Page 93
Password Protected Downloads ..................... Page 94
Password Kill After Downloading .................. Page 94
Bi-Directional Upload ............................ Page 94
File Queue .......................................... Page 94
Download ......................................... Page 95
List Selected Files .............................. Page 95
Remove ........................................... Page 95
Estimated Transfer Time .......................... Page 95
Trans Stats ......................................... Page 95
Messages ............................................ Page 95
Type ................................................ Page 95
Protocol ............................................ Page 95
Extract ............................................. Page 96
Restrictions ..................................... Page 96
Auto-Cleanup ..................................... Page 96
Rearchive ........................................ Page 96
Contents ............................................ Page 96
Achiever Notes ................................... Page 97
New Files ........................................... Page 97
Conference .......................................... Page 97
Gate_fr ............................................. Page 97
File One ............................................ Page 98
Dl Time ................................................ Page 98
Error Messages ...................................... Page 98
File Transfer Protocols ................................ Page 98
Internal ............................................ Page 98
External ............................................ Page 99
How It All Works ....................................... Page 101
Protocol.cfg Fields .................................... Page 101
Name ................................................ Page 101
Program ............................................. Page 101
Send File(s) ........................................ Page 101
Receive File(s) ..................................... Page 101
Slow Speed Cps And High Speed Cps ................... Page 102
Batch Protocol ...................................... Page 102
Access Level ........................................ Page 102
New Callers ...................................... Page 102
Embedded Protocol Characters ........................... Page 103
Bi-Directional Protocols ............................... Page 104
Restrictions ........................................ Page 105
Validation And Virus Checking ............................. Page 106
Files.qbs ................................................. Page 106
Confiles ............................................... Page 107
Fam: File Area Manager ................................. Page 107
Screen Layout ....................................... Page 108
Using Fam ........................................... Page 108
Move ................................................ Page 108
Table of Contents
iix
Kill ................................................ Page 109
Change Areas ........................................ Page 109
Upload .............................................. Page 109
Dnload .............................................. Page 109
Edit ................................................ Page 109
Info ................................................ Page 110
Orphans ............................................. Page 110
Arcview ............................................. Page 110
Arcformat ........................................... Page 110
Arcaddcomment ....................................... Page 111
Shell ............................................... Page 111
Rename .............................................. Page 111
Untag All ........................................... Page 111
Transpose ........................................... Page 112
System Bulletins .......................................... Page 112
Xxxxx.msg .............................................. Page 112
Warning ............................................. Page 112
Accxxxx.bbs ............................................ Page 113
Smart(tm) Bulletins .................................... Page 113
Getting On-Line ........................................... Page 113
Required Command Line Parameters ....................... Page 114
Confusing Rains ..................................... Page 114
Optional Settings ...................................... Page 114
-T, Time Till Next Event ............................ Page 114
-M, Memory File ..................................... Page 115
-L, Local Mode ...................................... Page 115
-K, No Multi-Tasker ................................. Page 115
-Hxxx ............................................... Page 115
-Cx ................................................. Page 115
-X .................................................. Page 116
-Oxxxx .............................................. Page 116
-Sxxxx .............................................. Page 116
Comport.dat ............................................... Page 117
Nodexx.ini ................................................ Page 117
Osm ....................................................... Page 122
Overview ............................................... Page 122
Main Display ........................................... Page 122
File ................................................... Page 123
Msg .................................................... Page 123
Access ................................................. Page 123
Sysinfo ................................................ Page 123
Main ................................................... Page 123
Jump ................................................... Page 123
Clone .................................................. Page 124
Mass ................................................... Page 124
Delete ................................................. Page 124
Verify ................................................. Page 125
Dialog Confirmation Box's .............................. Page 125
Table of Contents
ix
Edit Mode .............................................. Page 126
Editing Individual Fields ........................... Page 126
Backspace ........................................ Page 126
Ctrl-Currt ....................................... Page 126
Curlf ............................................ Page 126
Currt ............................................ Page 126
Delete ........................................... Page 126
End .............................................. Page 126
Esc .............................................. Page 126
Home ............................................. Page 126
Insert ........................................... Page 126
Screen Movement ..................................... Page 126
Up Arrow & Reverse Tab ........................... Page 126
Down Arrow, Return, Tab .......................... Page 126
Pgup & Pgdn ...................................... Page 126
Ctrl-Home & Ctrl-End ............................. Page 126
Ctrl-Return ...................................... Page 126
Flags .................................................. Page 126
Misc ................................................... Page 127
Protocol ............................................ Page 127
Sig ................................................. Page 127
Com Port Defs ....................................... Page 127
Nodexx.ini Compiler ................................. Page 127
Dbase ............................................... Page 127
Pack Db ............................................. Page 127
Make Db ............................................. Page 128
Add Db .............................................. Page 128
Mouse .................................................. Page 128
Vertical Menus ..................................... Page 128
Editing ............................................. Page 129
Confirmation Box .................................... Page 129
Cat.exe ................................................... Page 129
Cat's Report To You .................................... Page 130
Cat.cfg ................................................ Page 132
Explanation ............................................ Page 133
<Day Of Week> ....................................... Page 133
<Day Of Month> ...................................... Page 133
Delete Received ..................................... Page 133
Delete Unread ....................................... Page 134
Backup Message Center ............................... Page 134
Backup Files.dat .................................... Page 134
Backup User Records ................................. Page 134
Rebuild Files.qbs Indices ........................... Page 135
File Sort Type ...................................... Page 135
Archive Type ........................................ Page 136
Check Message Areas ................................. Page 136
History ............................................. Page 137
Delete Old Bulletins ................................ Page 137
Delete User Records ................................. Page 138
Post Conference ..................................... Page 138
Table of Contents
x
Post Bulletin ....................................... Page 139
Conference Stats .................................... Page 139
Delete Old Files .................................... Page 140
Make Filelist ....................................... Page 140
Run External ........................................ Page 141
Virus Check ......................................... Page 142
Disadvantages! ................................... Page 142
Cat File Integrity System ........................... Page 143
Chksum.exe ....................................... Page 144
Synchronizing Access Levels ......................... Page 145
Command Line ........................................... Page 145
Cat B ............................................... Page 145
Cat V ............................................... Page 145
Cat S ............................................... Page 145
Cat M ............................................... Page 146
Cat P ............................................... Page 146
Cat ? ............................................... Page 146
Cat F ............................................... Page 146
Mkpost.exe ............................................. Page 146
User.exe .................................................. Page 146
Primary Control Boxes And Main Screen .................. Page 146
Flags .................................................. Page 147
Date ................................................... Page 147
Del .................................................... Page 147
Undel .................................................. Page 147
Find ................................................... Page 148
Print .................................................. Page 148
Pack ................................................... Page 149
Index .................................................. Page 149
Page4 .................................................. Page 149
Page2 .................................................. Page 149
Sort ................................................... Page 150
Left/Right Arrow ....................................... Page 150
First / Last ........................................... Page 150
Add .................................................... Page 150
Cdnup .................................................. Page 150
Type Of Clear ....................................... Page 150
Which Records To Clear .............................. Page 150
Page3 .................................................. Page 151
Dynamic Access Level Changing .......................... Page 151
Shift Up Range ...................................... Page 151
Shift Dn Range ...................................... Page 151
Change Specific ..................................... Page 151
Access.sys ................................................ Page 152
Time Limit Per Call ................................. Page 153
Time Limit Per Day ..................................... Page 153
Download Limits ........................................ Page 153
File Ratio Limits ...................................... Page 153
Byte Ratio ............................................. Page 153
Time Give Back ......................................... Page 154
Table of Contents
xi
Byte Give Back ......................................... Page 154
Password Protect Uploads ............................... Page 154
Allow Password/Kill .................................... Page 154
Attach File To Message ................................. Page 154
Twitting A User ..................................... Page 154
Display Files ............................................. Page 155
Logo.asc/Mmu/Ans ....................................... Page 155
Nodexx.asc/Mmu/Ans ..................................... Page 155
Tlimit.asc/Mmu/Ans ..................................... Page 155
Xxxx.msg ............................................... Page 155
Accxxxx.bbs ............................................ Page 155
Rookie.asc/Mmu/Ans ..................................... Page 156
Welcome.asc/Mmu/Ans .................................... Page 156
Welcome2.asc/Mmu/Ans ................................... Page 156
Welcome3.asc/Mmu/Ans ................................... Page 156
Welcome4.asc/Mmu/Ans ................................... Page 156
Welcome5.asc/Mmu/Ans ................................... Page 156
Main.asc/Mmu/Ans ....................................... Page 156
Mainhelp.asc/Mmu/Ans ................................... Page 156
Byebye.asc/Mmu/Ans ..................................... Page 157
Byebye2.asc/Mmu/Ans .................................... Page 157
Dos.asc/Mmu/Ans ........................................ Page 157
Back.asc/Mmu/Ans ....................................... Page 157
Last_on.asc/Mmu/Ans .................................... Page 157
Main1.prg .............................................. Page 157
Main2.prg .............................................. Page 157
Main3.prg .............................................. Page 157
Main4.prg .............................................. Page 157
Main5.prg .............................................. Page 158
Main6.prg .............................................. Page 158
Main7.prg .............................................. Page 158
Main8.prg .............................................. Page 158
Main9.prg .............................................. Page 158
Main10.prg ............................................. Page 158
Msghelp.asc/Mmu/Ans .................................... Page 158
Gate_m.asc/Mmu/Ans ..................................... Page 158
Editor.asc/Mmu/Ans ..................................... Page 159
Peditor.asc/Mmu/Ans .................................... Page 159
Edhelp.asc/Mmu/Ans ..................................... Page 159
Mchelp.asc/Mmu/Ans ..................................... Page 159
Maskhelp.asc/Mmu/Ans ................................... Page 159
Setboard.asc/Mmu/Ans ................................... Page 159
Confhelp.asc/Mmu/Ans ................................... Page 159
Filehelp.asc/Mmu/Ans ................................... Page 159
Gate_f.asc/Mmu/Ans ..................................... Page 160
File1.asc/Mmu/Ans ...................................... Page 160
Search.asc/Mmu/Ans ..................................... Page 160
Ratio.asc/Mmu/Ans ...................................... Page 160
Byte.asc/Mmu/Ans ....................................... Page 160
Mhelp.asc/Mmu/Ans ...................................... Page 160
Table of Contents
xii
Cselect.asc/Mmu/Ans .................................... Page 160
Slhelp.asc/Mmu/Ans ..................................... Page 160
Showibm.asc/Mmu/Ans .................................... Page 161
Showansi.asc/Mmu/Ans ................................... Page 161
No_ansi.asc/Mmu/Ans .................................... Page 161
Mcmenu.asc/Mmu/Ans ..................................... Page 161
Read.asc/Mmu/Ans ....................................... Page 161
Chelp.asc/Mmu/Ans ...................................... Page 161
Phone.asc/Mmu/Ans ...................................... Page 161
Onewhelp.asc/Mmu/Ans ................................... Page 161
Uphelp.asc/Mmu/Ans ..................................... Page 161
Dnhelp.asc/Mmu/Ans ..................................... Page 162
H_chelp.asc/Mmu/Ans .................................... Page 162
Cslhelp.asc/Mmu/Ans .................................... Page 162
Email.asc/Mmu/Ans ...................................... Page 162
Twit.asc/Mmu/Ans ....................................... Page 162
Birth.asc/Mmu/Ans ...................................... Page 162
Sys_stat.asc/Mmu/Ans ................................... Page 162
Private.asc/Mmu/Ans .................................... Page 162
New1.asc/Mmu/Ans ....................................... Page 162
New2.asc/Mmu/Ans ....................................... Page 162
Fdisplay.asc/Mmu/Ans ................................... Page 163
Statmenu.asc/Mmu/Ans ................................... Page 163
Promenu.asc/Mmu/Ans .................................... Page 163
Prohelp.asc/Mmu/Ans .................................... Page 163
Sintro.asc/Mmu/Ans ..................................... Page 163
Slist.asc/Mmu/Ans ...................................... Page 163
Infxxxx.asc/Mmu/Ans .................................... Page 163
Bulxxxx.asc/Mmu/Ans .................................... Page 163
Files ..................................................... Page 164
Callx.dat .............................................. Page 165
Comport.dat ............................................ Page 165
Xxxmsg.yyy ............................................. Page 165
S_node.dat ............................................. Page 165
Userx.qbs .............................................. Page 165
Msgboard.qbs ........................................... Page 165
Hdrxxx.sys ............................................. Page 165
Txtxxx.sys ............................................. Page 165
Hdp.sys ................................................ Page 166
Txtp.sys ............................................... Page 166
Msgx.doc ............................................... Page 166
Newmail.sys ............................................ Page 166
Pmail.idx .............................................. Page 166
Hdh.sys ................................................ Page 166
Txtp.sys ............................................... Page 166
User.bbs ............................................... Page 166
User.idx ............................................... Page 166
Alias.idx .............................................. Page 166
Filboard.qbs ........................................... Page 167
Files.dat .............................................. Page 167
Table of Contents
xiii
Files.idx .............................................. Page 167
Dl_area.idx ............................................ Page 167
Upx.bbs ................................................ Page 167
Dnx.bbs ................................................ Page 167
Ncx.bbs ................................................ Page 167
Badfiles.bbs ........................................... Page 167
Sendx.ctl .............................................. Page 168
Tranx.log .............................................. Page 168
Effx.log ............................................... Page 168
Protocol.cfg ........................................... Page 169
Default.msg ............................................ Page 169
Osiris.err ............................................. Page 169
Welcome.bbs ............................................ Page 169
Proboard.qbs ........................................... Page 169
Hpdxxxx.dat ............................................ Page 169
Tpdxxxxx.dat ........................................... Page 169
Mainpriv.qbs ........................................... Page 169
Access.sys ............................................. Page 170
Sysinfo.qbs ............................................ Page 170
Laston ................................................. Page 170
Callx.cnt .............................................. Page 170
Nodex .................................................. Page 170
Bulletin.hdr ........................................... Page 170
Bulletin.txt ........................................... Page 170
Mod.ctl ................................................ Page 170
Baud.dat ............................................... Page 171
Dorinfox.def ........................................... Page 171
Door.sys ............................................... Page 171
Sig.def ................................................ Page 171
Sigx.log ............................................... Page 171
Chat.dmp ............................................... Page 171
Tcallx.bbs ............................................. Page 171
Histx.log .............................................. Page 172
Outx.qbs ............................................... Page 172
Myyxxxx.txt ............................................ Page 172
Key.def ................................................ Page 172
Cmds.dat ............................................... Page 172
Cmds.key ............................................... Page 172
Nodex.cfg .............................................. Page 172
Ansi.sys .................................................. Page 173
What About Security? ...................................... Page 173
Avs(tm) ................................................... Page 175
What To Do? ............................................ Page 176
Memory Manager ............................................ Page 176
Vms Errors And Their Meanings .......................... Page 177
Too Many Open Files ................................. Page 177
Access Denied ...................................... Page 177
Cannot Locate Comspec ............................... Page 177
Memory Control Blocks Are Damaged ................. Page 177
Not Enough Disk Space .............................. Page 177
Table of Contents
xiv
Error Writing The File .............................. Page 177
Too Many File Handles ............................... Page 178
Interrupt(s) Changed During A Shell ................. Page 178
Too May Mcbs ........................................ Page 178
Locked Dte ................................................ Page 178
Keyboard Commands ......................................... Page 179
Confirming Sysops Intentions ........................... Page 179
Node Restricter ........................................... Page 179
Command Stacking .......................................... Page 180
Command Stacking Example ............................... Page 180
Special Stacking Characters ............................ Page 180
Hotkeys ................................................... Page 181
Birthdate ................................................. Page 181
Caller's Telephone Number ................................. Page 181
Example ................................................ Page 181
Screen Length ............................................. Page 182
Passwords ................................................. Page 182
Changing Passwords ..................................... Page 183
Rotating Passwords ..................................... Page 183
Alias ..................................................... Page 183
Private Listing ........................................... Page 183
Accounting System ......................................... Page 184
Message Conference Check .................................. Page 184
Stats Screen .............................................. Page 184
Personal Mail Check, Message Center ....................... Page 184
Searching For New Files ................................... Page 185
Logging The Search Date ................................ Page 185
Hard Drive Maintenance .................................... Page 186
Error Handling ............................................ Page 186
Sample Osiris.err ...................................... Page 186
Error L1000 ......................................... Page 186
Error L1000 ......................................... Page 186
Error L1000 ......................................... Page 186
Error F2002 ......................................... Page 186
Error L1000 ......................................... Page 186
F20xx Error Codes ...................................... Page 187
F2001 ............................................... Page 187
F2002 ............................................... Page 187
F2003 ............................................... Page 187
F2004 ............................................... Page 187
F2005 ............................................... Page 187
F2006 ............................................... Page 187
F2007 ............................................... Page 187
F2008 ............................................... Page 187
F2009 ............................................... Page 187
F2010 ............................................... Page 187
F2011 ............................................... Page 187
F2012 ............................................... Page 187
F2013 ............................................... Page 187
F2015 ............................................... Page 187
F2099 ............................................... Page 187
Table of Contents
xv
Warning Messages .......................................... Page 187
Lm1001 ................................................. Page 187
Lm1002 ................................................. Page 187
Error Xxxx9000 ............................................ Page 187
Ansi Esc Filter ........................................... Page 188
Slash Commands ............................................ Page 188
Restrictions ........................................... Page 189
Illegal Names .......................................... Page 190
Last On ................................................... Page 190
Mailer Combinations ....................................... Page 191
Commit Dos Function ....................................... Page 191
File Handles .............................................. Page 191
Color Optimizer ........................................... Page 191
Osiris And Multiple Nodes ................................. Page 192
Overview ............................................... Page 192
How It Works ........................................... Page 192
Hardware/Software ...................................... Page 193
Local Area Networks ................................. Page 193
Slave Card System ................................... Page 194
Desqview ............................................ Page 194
Caution .......................................... Page 195
Novell ................................................. Page 196
Peer-To-Peer Networks .................................. Page 196
Lantastic ........................................... Page 196
Slave Cards ............................................ Page 197
Desqview ............................................... Page 197
Exception 13 Errors ................................. Page 199
Very Important Read This ............................... Page 199
Help ................................................... Page 200
Games Or Doors And Other External Program ................. Page 200
Qkdoor/Doormaster Approach ............................. Page 201
Games ..................................................... Page 201
Installing A Game Sub-System ........................... Page 201
Step 1, Setting The Menu ............................ Page 202
Processing The Selection ............................ Page 206
Compiling Games.scr ................................. Page 209
The Individual Game Batch Files ........................ Page 209
Scab.bat ............................................ Page 210
Fish.bat ............................................ Page 210
Qkdoor Parameters ................................ Page 210
Dorinfo1.def/Door.sys .................................. Page 211
Dorinfo1.def ........................................ Page 211
Door.sys ............................................ Page 211
Slightly Advanced Game System .......................... Page 213
Explanation ......................................... Page 214
Overlaying A Game ...................................... Page 215
Advanced Set-Up ........................................ Page 215
Advantage .............................................. Page 216
Problem Areas .......................................... Page 217
Fossil ................................................. Page 217
Door Technical Support ................................. Page 218
Table of Contents
xvi
Private Cbis Systems ...................................... Page 218
Callxxx.cnt ............................................... Page 219
Rcp, Remote Command Processing ............................ Page 219
Message Cache ............................................. Page 219
Key.def ................................................... Page 220
Line Noise ............................................. Page 220
On-Line Store ............................................. Page 223
Creating Proboard.qbs .................................. Page 224
Sample .............................................. Page 225
Product Database Storage Structures .................... Page 226
Product Definitions ................................... Page 226
Maximum Field Lengths ............................... Page 227
Description Field ................................... Page 227
Example .......................................... Page 228
Example 2 ........................................ Page 228
Error In Osm ........................................... Page 230
Search All Departments ................................. Page 230
Imx ....................................................... Page 231
Optional Command Line Switches ......................... Page 231
/X .................................................. Page 231
/Mxxxxxx ............................................ Page 231
Warning .......................................... Page 231
/Dtr ................................................ Page 232
/Hot ................................................ Page 232
Sample Batch ........................................... Page 232
Shellxx.cfg ............................................ Page 232
Mdm Control File ....................................... Page 233
Modem Initialization String ......................... Page 233
Ok Return Code ...................................... Page 233
Events ................................................. Page 233
Exit Errorlevel ..................................... Page 234
Starting Time ....................................... Page 234
Ending Time ......................................... Page 234
Day Of Week ......................................... Page 234
Modems, In General ..................................... Page 236
Overlays .................................................. Page 236
Lim/Extended Memory .................................... Page 236
Vms Overlays ........................................... Page 237
Lock-Ups ............................................ Page 237
Speed Tips ................................................ Page 237
Lim 4.0 ................................................ Page 237
Cache .................................................. Page 238
640K Extender .......................................... Page 238
Asc/Mmu/Ans Files ...................................... Page 238
Ovl01818 And Ovl01819 .................................. Page 238
Mono-Graphics Adapter .................................. Page 238
16650 Uart ............................................. Page 238
Fast Harddrive ......................................... Page 239
Scsi ................................................ Page 239
Table of Contents
xvii
Tsr/Device Drivers ..................................... Page 239
Small Partitions ....................................... Page 239
Memory Manager ......................................... Page 239
Qemm ................................................ Page 239
Steath ........................................... Page 240
386Max .............................................. Page 240
Loadhi ................................................. Page 240
21St Century Bbsing ....................................... Page 241
Overlay Caching ........................................... Page 242
Price ..................................................... Page 242
Upgrading ................................................. Page 243
Upgrading To Newer Versions ............................ Page 243
Important Information .................................. Page 243
Upgrading To Multiple Lines Or Adding More Lines ....... Page 243
Lost Or Damaged Keys ...................................... Page 243
Bug Reports ............................................... Page 244
Suggestions ............................................... Page 244
Help ...................................................... Page 244
Busy ................................................... Page 244
Exceptional Important, Must Read! ...................... Page 245
Spl/I ..................................................... Page 246
Spl/I Verses Itp ....................................... Page 246
Don't Be Overwhelmed ................................ Page 247
Introduction ........................................... Page 247
Data: Variables And Constants .......................... Page 247
Data Classes ........................................... Page 248
Integer ............................................. Page 249
Unsigned_integer ................................. Page 249
Long ............................................. Page 249
Unsigned_long .................................... Page 250
Real ................................................ Page 250
Intermixing Data Classes ............................... Page 251
Declaring An Integer Variable .......................... Page 251
Initializing A Variable ................................ Page 252
Integer Constants ...................................... Page 252
Printing Variables And Constants ....................... Page 254
Character Class ........................................ Page 254
Using Strings .......................................... Page 254
Declaring A String Variable ......................... Page 255
Initializing A String Variable ...................... Page 255
String Constants .................................... Page 256
Maximum Number Of Active Variables ..................... Page 257
Variable Names ......................................... Page 257
Predefined Variables ................................... Page 258
Restrictions ........................................ Page 261
Spl/I Command Format ................................... Page 262
Language Syntax ....................................... Page 262
Structure .............................................. Page 263
Table of Contents
xiix
Procedures, Variable Types, And Order .................. Page 265
Procedures .......................................... Page 265
Data Types .......................................... Page 267
Global ........................................... Page 267
Automatic ........................................ Page 268
Order ............................................... Page 269
_++(X); ................................................ Page 270
_--(X); ................................................ Page 271
_Atol(destination,source); ............................. Page 272
_Atoi(destination,source); ............................. Page 272
_Atof(destination,source); ............................. Page 272
_Call(procedure_name); ................................. Page 274
_Cast(chickens, Class); ................................ Page 275
_Chdir(directory); ..................................... Page 277
_Clear(variable); ...................................... Page 278
_Cls(); ................................................ Page 279
_Color(value); ......................................... Page 280
_Command_queue_status(rtcode); ......................... Page 281
_Convert_to_bbs_case(s1); .............................. Page 282
_Copy_ch(ch,string,position); .......................... Page 283
Program Explanation ................................. Page 284
_Continue; ............................................. Page 287
_Curget(row,col); ...................................... Page 288
_Dayofweek(day); ....................................... Page 289
Database ............................................... Page 290
_Addrecord() ........................................ Page 290
_Loadrecord(rtcode,key) ............................. Page 290
_Copyfrom(dest,field#) .............................. Page 290
_Opendatabase(fname) ................................ Page 290
_Closedatabase() .................................... Page 291
_Getnextrecord(rtcode) .............................. Page 291
_Settofirstrecord() ................................. Page 291
_Deleterecord(rtcode,key) ........................... Page 291
_Rewriterecord() .................................... Page 291
_Copyto(field#,source) .............................. Page 291
_Define_var(name,class); ............................... Page 292
Warning! ............................................ Page 293
Tip ................................................. Page 293
_Display_memo_record(data_file,index_file,record_no.); . Page 295
_Display_menu(cmds,fname); ............................. Page 296
_Display_text(filename); ............................... Page 297
Warning ............................................. Page 297
_Dorinfo(path,prog); ................................... Page 298
_Doorsys(path,prog); ................................... Page 299
_Elseif(expression......); ............................. Page 300
_Else; .............................................. Page 300
_Eend; .............................................. Page 300
Example Of Nesting Elseif Statements. ............... Page 302
_Execute(memory,program,rtcode); ....................... Page 307
Quickbasic Brun.exe ................................. Page 307
Table of Contents
xix
_Fclose(stream); ....................................... Page 310
_Fcloseall(value); ..................................... Page 311
_Fgets(string, N, Stream, Rtcode, Flag); ............... Page 312
_Fildate(filename,y,m,d); .............................. Page 313
_File_command_access(cmd_number,rtcode); ............... Page 314
_Filexists(rtcode,filename); ........................... Page 315
_Filsize(filename,size); ............................... Page 316
_Filtime(filename,h,m,s); .............................. Page 317
_Fopen(path,variable,type); ............................ Page 318
Explanation ......................................... Page 319
Maximum Open Files .................................. Page 319
_For(start = Value : Condition End : Step); ............ Page 320
_Fend; .............................................. Page 320
_Fprintf(file,format{,variable 1, Variable 2, .....}); . Page 324
_Free_var(name); ....................................... Page 325
_Fscanf(return_code,stream,format{variables....}); ..... Page 326
File Field Delimiters ............................... Page 326
_Get_ctrled_input(ch,cmds); ............................ Page 328
_Getc(char,force_upper); ............................... Page 329
_Gets(str,len); ........................................ Page 330
_Global_download(); .................................... Page 331
Highlevel Commands ..................................... Page 332
_Post_private_msg(); ................................ Page 332
_Post_msg_to_sysop(); ............................... Page 332
_Display_protocol_name(); ........................... Page 332
_Goto_file_system(); ................................ Page 332
_Goto_msg_system(); ................................. Page 332
_Run_newmail_scan(); ................................ Page 332
_Run_newuploads_scan(); ............................. Page 332
_Goto_online_store(); ............................... Page 332
_Show_who_is_online(); .............................. Page 332
_Goto_log_off(); .................................... Page 332
_Goto_display_version(); ............................ Page 332
_Goto_status_system(); .............................. Page 332
_Page_sysop(); ...................................... Page 332
_Goto_adjust_user_settings(); ....................... Page 332
_Display_callers(); ................................. Page 332
_Goto_msg_center(); ................................. Page 332
_Edit_conf_boards(); ................................ Page 332
_Change_file_area(); ................................ Page 332
_Search_for_file(); ................................. Page 332
_Upload(); .......................................... Page 332
_View_archive(); .................................... Page 332
_Quick_file_list(); ................................. Page 332
_Full_file_list(); .................................. Page 332
_Kill_file(); ....................................... Page 332
_Type_text_file(); .................................. Page 332
_Select_protocol(); ................................. Page 332
_Extract_file(); .................................... Page 332
_Transfer_stats(); .................................. Page 332
Table of Contents
xx
_Edit_queue(); ...................................... Page 332
_Download(); ........................................ Page 332
_Internode_chat(); .................................. Page 332
_Read_bulletins(); .................................. Page 332
_Private_mail_scan(); ............................... Page 332
_New_bulletin_scan(); ............................... Page 332
_Change_msg_areas(); ................................ Page 332
_Enter_message(); ................................... Page 332
_Read_messages(); ................................... Page 332
_Pack_messages(); ................................... Page 332
_Drop_carrier(); .................................... Page 332
_If(expression......); ................................. Page 333
_Endif; ............................................. Page 333
Nesting ............................................. Page 340
Trick! .............................................. Page 340
_Is_message_area_selected(area#, Rtcode); .............. Page 342
_Locate(row,col); ...................................... Page 343
_Main_command_access(cmd_number,rtcode); ............... Page 344
_Make_mask(dest,source,mask); .......................... Page 345
_Masked_input(flag,s1,mask); ........................... Page 346
_Math(results = Format); ............................... Page 348
Restrictions ........................................ Page 349
Advanced Arithmetic Operations ...................... Page 349
Bit Fiddling, Operators And Fields ............... Page 349
Operators ........................................ Page 350
Bitwise Logical Operators ........................ Page 350
Bitwise And ................................... Page 350
Bitwise Or .................................... Page 350
Bitwise Exclusive Or .......................... Page 351
Case Sensitive ................................ Page 351
Usage ......................................... Page 351
Bitwise Shift Operators .......................... Page 352
Left Shift .................................... Page 352
Right Shift ................................... Page 353
Usage ......................................... Page 353
Modulus Operator ................................. Page 354
_Msg_command_access(cmd_number,rtcode); ................ Page 355
_Printf(format{,variable 1, Variable 2, .....}); ....... Page 356
_Push_into_queue(s1); .................................. Page 360
_Putc(ch); ............................................. Page 361
_Replace_ch(ch,string,position); ....................... Page 362
_Rewind(file); ......................................... Page 363
_Send_file(rtcode,file); ............................... Page 364
_Setdisplay(type); ..................................... Page 365
_Set_file_area(area); .................................. Page 366
_Set_node_status(status); .............................. Page 367
_Set_msg_area(area); ................................... Page 368
_Setcmdkey(string); .................................... Page 369
_Setlangname(string); .................................. Page 370
_Setmenupath(string); .................................. Page 371
Table of Contents
xxi
_Spawn(program); ....................................... Page 372
Warning ............................................. Page 372
_Sprint(format); ....................................... Page 373
_Sprintf(variable,format{,variable1, Variable2, .....}); Page 374
_Storage(name,len); .................................... Page 375
_Strcat(string1,string2); .............................. Page 376
_Strindex(rcode,string1,string2); ...................... Page 377
_Strlen(string,length); ................................ Page 379
_Switch(ch); ........................................... Page 380
_Case(value); ....................................... Page 380
_Break; ............................................. Page 380
_Send; .............................................. Page 380
_Sysdate(year,month,day); .............................. Page 383
_Systime(h,m,s,hu); .................................... Page 384
_Timerset(v1,1000); .................................... Page 385
_Timeup(v1,rtcode); .................................... Page 386
_Unlink(file); ......................................... Page 387
_While(expression......); .............................. Page 388
_Wend; .............................................. Page 388
Windows ............................................... Page 389
_Openwindow(win#,ur,uc,lr,lc,border_type,border_color)Page 389
_Closewindow(win#); ................................. Page 389
_Clearwindow(win#); ................................. Page 389
Spl/I Database System ..................................... Page 392
Number Of Fields ....................................... Page 392
Defining A Database ....................................... Page 392
Creating Vetlink.scr ...................................... Page 396
Spl/I, A Functional Example ............................... Page 412
Itc, Itc2, And Itlink ..................................... Page 421
Itc.exe ................................................ Page 421
Itlink.exe ............................................. Page 421
Linking Multiple Object Modules ..................... Page 422
Compiler/Linker Limits ................................. Page 423
Run.exe ................................................ Page 423
Memo Databases ............................................ Page 424
Uses ................................................... Page 424
How .................................................... Page 424
Making A Memo Database ................................. Page 424
Memo Infomall.txt ................................... Page 426
Mmu ....................................................... Page 427
Mmu.exe ................................................ Page 427
Command Line Switches ............................... Page 428
/A ............................................... Page 428
/B ............................................... Page 428
/C ............................................... Page 428
/N ............................................... Page 428
/M ............................................... Page 428
/F ............................................... Page 428
/25 .............................................. Page 428
/O ............................................... Page 428
Table of Contents
xxii
/B ............................................... Page 428
/C ............................................... Page 428
/N ............................................... Page 428
/M ............................................... Page 428
/25 .............................................. Page 429
/O ............................................... Page 429
Precompile Format ...................................... Page 429
Mmu Commands ........................................... Page 429
[Black] ............................................. Page 430
[Red] ............................................... Page 431
[Green] ............................................. Page 432
[Blue] .............................................. Page 433
[Yellow] ............................................ Page 434
[Magenta] ........................................... Page 435
[Cyan] .............................................. Page 436
[White] ............................................. Page 437
[Brown] ............................................. Page 438
[Gray] .............................................. Page 439
[Ltred] ............................................. Page 440
[Ltgreen] ........................................... Page 441
[Ltblue] ............................................ Page 442
[Ltmagenta] ......................................... Page 443
[Ltcyan] ............................................ Page 444
[Blink] ............................................. Page 445
[Normal] ............................................ Page 446
[Bgblack] ........................................... Page 447
[Bgred] ............................................. Page 448
[Bggreen] ........................................... Page 449
[Bgblue] ............................................ Page 450
[Bgmagenta] ......................................... Page 451
[Bgcyan] ............................................ Page 452
[Bgwhite] ........................................... Page 453
[Enter] ............................................. Page 454
[Breakoff] .......................................... Page 455
[Breakon] ........................................... Page 456
[Moreoff] ........................................... Page 457
[Moreon] ............................................ Page 458
[Cls] ............................................... Page 459
[Run_program Prg_name] .............................. Page 460
Osiris Language Database .................................. Page 461
Cmdmake.exe ............................................ Page 462
Ascii.txt .............................................. Page 462
Cmds.key ............................................... Page 462
Lankey.exe ............................................. Page 462
Designing Your Own Bbs .................................... Page 463
Autoexec.prg ........................................... Page 463
Getting Started ........................................ Page 463
Main_menu .............................................. Page 475
File Subsystem ......................................... Page 484
Press_return ........................................... Page 490
Table of Contents
xxiii
Process_slash .......................................... Page 490
Wrap Up ................................................ Page 492
Tip .................................................... Page 492
Spl/I Source Files ..................................... Page 493
Speed Tip .............................................. Page 493
File Structures ........................................... Page 494
_Hdrxxxxx .............................................. Page 494
_Message_header ........................................ Page 495
Conference Message Attributes ....................... Page 495
_Keydef ................................................ Page 496
_Access_sys ............................................ Page 496
_User_record ........................................... Page 497
_Mainpriv .............................................. Page 498
_Lastcaller ............................................ Page 498
_Filboard .............................................. Page 499
Programmers Notes ................................... Page 499
_Msgboard .............................................. Page 500
_Filesbbs .............................................. Page 500
Protocol_rec ........................................... Page 500
_Msg_center_msg ........................................ Page 501
_History_log ........................................... Page 501
Packed Time Fields .................................. Page 501
Packed Date Fields .................................. Page 501
Packing A Date Field ............................. Page 501
Unpacking A Date Field ........................... Page 502
Outxx.qbs .............................................. Page 502
_Outctl ................................................ Page 502
Programming Notes .................................. Page 503
Osiris SE Technical Reference Manual Page 1
Warranty
Osiris carries no warranty of any kind. If the program proves
defective, you assume the entire cost of all necessary
servicing, repair or correction.
I do not warrant, guarantee, or make claims regarding the use
of, accuracy, or reliability of this product. You rely on the
program and its results solely at your own risk. I cannot
accept responsibility for system damage, loss of profit, or
any other special, incidental, or consequential damage
resulting from the use or misuse of this product.
Distribution Policy And Copyright
Copyright
Despite the method of marketing, Osiris SE is not in the
public domain. Osiris SE is a proprietary product of
International TeleCommunications, protected under U.S.
copyright law, International treaty provisions, and trade
secret laws of general applicability.
Copying, duplicating, selling or otherwise distributing this
product, except as expressly permitted in the TEST-DRIVE
Distribution Policy is a violation of the Law. You are,
however, granted the right, in fact encourage, to make and
distribute copies of this TEST-DRIVE version, with the
following provisions.
Osiris SE Technical Reference Manual Page 2
-- Test-Drive Distribution Policy --
1. Feel free to distribute the TEST-DRIVE version as often
as you like.
2. Please do not distribute the program without all of its
original files.
3. You must get written permission before distributing
Osiris with any "Bundled" software packages.
4. You may NOT accept payment for the program. A copying
fee of 10.00 per diskette may be charged when
distributed by a non-profit user-group.
5. You may NOT alter the program or documentation in any
way.
6. Individuals, groups, vendors, or other software
distribution companies who market diskettes containing
the TEST-DRIVE programs for profit must NOTIFY us, in
writing, 30 days before distribution.
Hardware Requirements
Osiris SE is not compatible with single or dual floppy drives
and computers with limited memory. Your memory and storage
areas must be large enough to hold the files and work areas
required during normal operations.
We have no plans of changing the program to fit systems with
limited capacity. The following list represents the minimum
configuration your system should have to maximize the
potential of the program.
- IBM Personal Computer (or true compatible) with 512K
(minimum) RAM, 450K free for Osiris. I suggest,
although NOT required, 512K of AST EEMS
3.20 or LIM 4.00 RAM
- PC-DOS or MS-DOS, Ver. 3.0 or later (other operating
environments such as DESQview may be used).
- Asynchronous communications (serial port) adapter
- RS-232 cable with the standard nine pins connected (some
modem cables do not have all the pins hooked-up).
- Intelligent AT command set modem
- Eighty column monochrome or color monitor
- Voice-grade telephone connection for modem
- Hard disk drive
Archive Contents, Exe's
I'll attempt to list all the EXE files contained within the
SE archives, along with some of the other important files,
along with a brief explanation. I want to apologize if I miss
any and I hope you'll let us know about it.
Osiris SE Technical Reference Manual Page 3
Zmodem.exe, a zmodem driver. You're free and in fact
encouraged to use whatever driver works best on your system.
Ymodem.exe, a Ymodem batch and Ymodem-G driver. You're free
and in fact encouraged to use whatever driver works best on
your system.
Xmodem.exe, a Xmodem and Xmodem1k driver. You're free and in
fact, encouraged to use whatever driver works best on your
system.
Chksum.exe, figures and prints a CAT file integrity
checksum on any give file or files.
Index.exe, used by several programs to rebuild the newmail
indices.
Mmu.exe, Multi-Menu compiler.
Ovl01818.exe, one of the Osiris VMS overlays. Must be in the
same directory as Osiris.exe.
Bullgen.exe, used to generate system bulletins.
Confile.exe, converts Opus/Fido style Files.BBS files to
Osiris Files.qbs format.
Fam.exe, used to manage Osiris File areas. Move files, edit
listings, etc.
Cat.exe, Osiris Automatic maintenance system.
Sphinx.exe, sysop stand alone Message editor.
Ulink.exe, used to generate conversation chains in echomail
areas.
Osm.exe, Osiris system manager. Used to create file areas,
message areas, define menu keys, protocol drivers, etc.
Osm.ovl, Overlay File.
Osiris.exe, Main Osiris program.
Imx.exe, front-end that answers the phone and calls Osiris.
For those that do not use mailers.
Readarc.exe, an echomail statistics program. Shows who you
are exporting mail to and how much.
Osiris SE Technical Reference Manual Page 4
Export.exe, Halcyon echomail export program.
Import.exe, Halcyon echomail import program.
Traffic.exe, Halcyon echomail statistics program. Shows all
kinds of echomail statistics.
Event.exe, used to compile the event.ini file for IMX.
Scan.exe, a virus checker used by Osiris to check new
uploads.
Osetup.exe, automatic installation program for NEW Osiris
sysops.
User.exe, used to manage Osiris user records.
Ovl01819.exe, VMS overlay. Should be in the same directory as
Osiris.exe.
Mkpost.exe, used to generate text files suited for BBS
displays.
Itc.exe, multiple stage SPL/I compiler.
Itlink.exe, SPL/I run time linker.
Memo.exe, Memo Database compiler.
Cmds.dat, Language database.
Ascii.txt, ASCII version of language database.
Cmdmake.exe, Language database compiler.
Lankey.exe, Language command Key editor.
Setlock.exe, Used to mass set EXE/COM/OVL/OVR files to READ
ONLY status, to prevent share volitions. Only needed on
systems running on a Network.
Test-Drive Mode
Once you have installed Osiris, you may download a special 30
day test drive key from Vetlink III at 1-314-334-6359. Just
type /DEMO from the main menu. Once you have received the
test drive key, all you have to do is move it into the
OSIRIS= directory.
Without the special 30 day test drive key, the DEMO copy of
Osiris will only support 20 user records. You can have more
than 20 user records, but Osiris will exit to DOS should you
attempt to use a record higher than 20.
Osiris SE Technical Reference Manual Page 5
Introduction
First things first, THANK YOU for trying Osiris. I'm sure
you'll find that it has everything you could possible want in
a BBS.
You're no doubt a bit stunned by the size of the
documentation, the doc's from HELL, and anyone would be. No
matter how good a program is, if you don't document the
features, they will not do you any good. Needless to say,
we've attempted to provide as much documentation as possible
and in clear, easy to read, terms.
I suggest that you read the first 200 pages before you do
anything. You don't have to print them, at least not right
away, but do read the first 200 or so pages before beginning
the installation process.
If you have a question, check the table of contents to see if
there is a TOPIC listed that relates to your question. The
documentation is extensive and seventy-five percent of the
questions our technicians answered last year WAS in this
document and they just quoted from it.
Not Just A Bbs Program
Osiris is NOT just a BBS program, it is an INTEGRATED
BBS operating SYSTEM. Unlike many other BBS programs, we
did not just STOP with the BBS itself. We have attempted
to provide you with everything you could possible need
to run a BBS.
Cost
Osiris cost less than any other BBS on the market. There
are several BBS' that have a base price less than
Osiris but with those BBS', the base price only covers
the BBS program itself. Many companies charge extra
for add-on programs that we provide with the package.
A lot BBS' do not even provide the add-on programs. You
have to call all over the country looking for 3rd party
add-on programs and in the process, run up a huge phone
bill and you still have to pay for the programs when you
do find them.
The cost of the Osiris package is less than $6.00 a
program, based on a single line system. You can't find,
download, and register a shareware program for that
amount.
Osiris SE Technical Reference Manual Page 6
Set Up
(Osetup)
Important Information
Osetup created a PRGS directory, in your Osiris root
directory, and moved all the *.EXE and *.COM files into
it. Osetup also added a PATH statement to your
autoexec.bat file pointing to this directory.
I did that to keep the number of files in your Osiris
directory to a minimum. You should NOT attempt to run
any of these programs FROM the PRGS directory. Log into
your OSIRIS directory and run the program from there.
DOS will find the program you want to run by searching
the PATH.
Again, you must be your Osiris= directory when you RUN
any program. The program you're RUNNING doesn't have to
be there, but you do.
Osetup set up the Message Center for Private Mail between you
and your callers and for private mail between callers. Osiris
and CAT maintain the message center and you don't need to do
anything to it.
Osetup created ONE PUBLIC conference area called GENERAL
TOPICS. Osiris uses the conference areas to hold public
messages to other individuals or messages to ALL. It's up to
YOU to create or define each area. I created the first one
for you, to help get you started. See section on Conference
Areas for further details.
Osetup created a file area, you place files you want your
callers to download in a file area, and you may create MORE,
up to 32721, when you decide you need them.
Osetup also created a UPLOAD area called files\uploads. This
is where ALL uploads for file area number one go.
Because of security problems, you must NEVER define any file
area and point both the UPLOAD path and the DOWNLOAD path to
the same directory. This does mean you'll have to MOVE the
new uploads to their download areas before they CAN be
downloaded, but it's well worth it.
Even if you decide that Osiris isn't for you, make sure that
the software you DO pick gives you this option. With other
BBS programs, like Opus and Maximums, it's even MORE
important.
Osiris SE Technical Reference Manual Page 7
Most of the other "set up" items were sub-systems (messages,
files, main, etc.) with default command keys, flag settings,
and of course, menus.
Local Testing
Directly following the Osetup installation, most want to
log-on in local mode to test the installation. Osetup should
have created, in your OSIRIS= directory, a batch file called
"LOCAL.BAT."
You can use this to log-on locally and TEST the primary
installation.
Reboot First
Don't forget to reboot your computer so the SET commands
Osetup added to your autoexec.bat file can take effect.
Local.bat should contain:
osiris -L -B2400 -P2 -N1
-P2 may be -P1 on your system. This is the MINIMUM command
line configuration required to log-on locally.
You MUST, and this is very important, be in the OSIRIS=
directory before you attempt to log-on locally with this
batch file.
On-Line Testing
The next thing you most likely want to try is putting the
basic installation on-line. Most of you will not want to RUN
the system AS IS, but you do want to see what it is like to
log-on remotely.
One common mistake is just typing "OSIRIS" at the DOS command
line and expect it to come on-line and that will NOT work.
If you have a mailer front-end then read the section in this
document called "Getting On-Line".
If you do not have a front-end, then read the section(s)
"Getting On-Line" and "IMX Osiris SE Front-end".
Menus
Beginners Menus
You have two types of display files, those having a file
extension of ANS and one with an extension of ASC.
The main menu file that I'll LOOK for is "MAIN.ANS and
MAIN.ASC."
Osiris SE Technical Reference Manual Page 8
I'll decide which file to display based on the callers
GRAPHIC settings, ANSI or NON-ANSI. If you have ANSI turned
on, I'll look FIRST for MAIN.ANS. If it exists, I'll show it.
If it does NOT exist, then I'll look for Main.asc and if it
exists, it'd better or you get nothing, then I'll show that
one. If you don't support ANSI I'll skip directly to
MAIN.ASC.
The first step to creating a new main menu is to load OSM and
go to the MAIN section. Here you'll find all the functions
available to you. Decide which ones you want, the command
keys that you want used, the access level and flag settings,
if any, and make the changes. Jot down which command keys you
used for each function. The entire process should take no
longer than a couple of minutes.
The next step is to create a MAIN.ANS file. This is the file
that gets displayed if the caller supports ANSI graphics.
Load an ansi draw program, THEDRAW is highly recommend, and
draw the menu the way you want it to look. You can use any
colors you want, but I do advice that you avoid using
background colors other than BLACK. You should clearly
outline the KEY required to activate each function.
One word of warning, do not go pass column seventy eight on
the screen. You'll want to avoid the DOS automatic screen
wrap and you do that by keeping the width to seventy eight or
less.
Once you've got the menu LOOKING the way you want, save it
using CLEAR SCREEN NO, HOME CURSOR NO, ANSI YES, and DISPLAY
SPEED 0.
The "save" file name should be MAIN.ANS.
You'll need to edit MAIN.ANS with your text editor and remove
the extra blank lines at the end of the file, to keep the
menu from scrolling off the screen.
The ANSI program MAY use the ANSI VERTICAL tab sequence
instead of blank lines. Check the file and if you see
something like "<-[20H, <-[21H, or <-[24H." The <- is an
arrow but WordStar doesn't allow that character, at the end,
remove them.
That's basically it, you have a full functional MAIN menu for
ANSI callers.
You must also create a menu for callers that do NOT support
ANSI.
Osiris SE Technical Reference Manual Page 9
Use your Text editor to create it and the layout is still up
to you. You should clearly outline the command keys needed to
active each selection. Some people encase the command key in
(), others use ) to separate the command key from the rest of
the text. Do NOT use the open and close square brackets, [ or
]. MMU reserves opening and closing brackets as command
indicators.
Once you've completed the NON-ANSI screen, save the file as
MAIN.ASC.
That's all there is to creating menus for Osiris. Thedraw is
a very powerful ANSI screen editor, the prefect tool for
doing color menus.
Slightly Advanced Menus
A slightly advanced method of doing menus involves combining
the ANSI and NON-ANSI menu into one file and compressing it
to speed up the display.
Take the MAIN.ANS file and rename it to M.ANS. This is
important because we don't want to FIND the MAIN.ANS. We want
to ALWAYS use the MAIN.MMU for ALL CALLERS.
NOTE: I assume that you did not use
animated ansi displays. You may NOT
convert animated ANSI files.
Load M.ANS into Thedraw and then save it with a clear screen.
Now you get to use MMU.EXE, the MMU compiler.
Use the following command line:
MMU M.ANS /A /F
Rename M.MMU to MAIN.MMU and you now have a finished main
menu file, compressed, that allows me to handle color
displays depending on the caller's graphic settings. You have
one file instead of two.
See the section on MMU for a detailed explanation of MMU.
WARNING: Do not attempt to load this
finished file and edit it. If you want to
make changes go back to the m.ans and
make the changes there then follow the
steps outlined above to create a new
main.mmu.
That's all there is to making menus for Osiris. You can now
make new menus for the message areas, file areas, main menu,
store, and other areas.
Osiris SE Technical Reference Manual Page 10
Odds And Ends
Environment Variable
Osiris requires TWO environment variables, OSIRIS=DRIVE:\PATH
and TXT=DRIVE:\PATH.
DRIVE: is the DRIVE letter and \PATH is the FULL path to the
directory.
OSIRIS= should point to the directory that contains the
Osiris system files (user records, message board definitions,
file area definitions, etc.).
TXT= should point to the directory that contains the MESSAGES
, HDRxxxx.SYS and TXTxxxx.SYS.
Osetup SHOULD have added the definitions to your AUTOEXEC.BAT
file.
OSIRIS=C:\OSIRIS
TXT=C:\OSIRIS\MSGS
There's also an optional setting you can use, HDR=, to SPLIT
the message base between drives and directories. The section
on Halcyon explains why you may want to do that.
Spl/I
SPL, Structured Programming Language version I, lets you
create questionnaires, and other items by creating command
programs with commands to generate color, branch, do
conditional testing, etc. over 150 different SPL/I command.
See section on SPL/I for further DETAILS.
Main Menu
The MAIN MENU display file, the one that shows the system
commands, for "Full" help is MAIN.(ASC/MMU/ANS) and
resides in the Osiris text support directory. This file
should list all the available commands for the main menu.
You can use SPL/I commands, so you're free to do just about
anything you can think of, including adding commands that
don't normally exist. See section on MENUS for details on
construction.
The HELP file for the Main Menu is MAINHELP.(ASC/MMU/ANS)
and should be placed in the Osiris text support directory.
From the main menu you have 15 built in function and 10 user
definable functions at your disposal.
Osiris SE Technical Reference Manual Page 11
All 25 functions have ACCESS levels and KEY command flag(s)
available for each individual command.
It's up to you to set the command KEY (A, B, C, etc.) to
active each function as well as the ACCESS level and flags,
if needed.
Those you do NOT want to use, set the ACCESS LEVEL to 32722.
Conference Area
This takes you to the message area(s) dedicated to
public messages.
These areas must be setup or defined by you. Follow the
guide lines laid out in the Conference section of this
document.
The Osetup.exe program set up ONE public conference area
for general conversations.
It's up you to decide IF public message area(s) will be
used. Some systems, those run by companies, may not need
or want to use such areas.
If this is the case, set the access level for the
function to 32722 and do not list the command key on the
full help menu.
File Area
Takes you to the file area(s). All files on the system,
those available for downloading, can be found here.
It's up to the you to set up the file areas. Osetup
installed one for you. See section on File Areas for
further details.
If you don't intend to have file(s) available for
downloading, set the access level to 32722 and don't
list a command key for this function on your full help
menu.
Log Off
Allows you to LOG off the system with the option of
leaving the sysop a message.
You do not have to use this function and hanging up
will not harm the software nor will it cause any
problems.
You may want to use a slash command, covered later, to
allow a QUICK log off without an optional message. If
so, create an SPL/I file as follows.
Osiris SE Technical Reference Manual Page 12
copy con OFF.SCR
_DROP_CARRIER();^Z
Compile with ITC.EXE by typing the following at the DOS
prompt:
ITC OFF
Now link with ITLINK using the following command
ITLINK OFF
Copy the OFF.PRG to your TEXT directory.
If you type /OFF, notice the '/'slash . . . it indicates
a slash command, I'll instantly log you off.
The /OFF can be used from any one of the three primary
menus; Main, Conference Area(s), or File Area(s).
User Status
This shows the sys_stat.(asc/ans/mmu) file normally
shown during the initial log-in process.
Bulletin
This will display a menu listing all the current system
bulletins, created with Bullgen.exe, and allows you to
read any or all of the old bulletins.
The menu is internal and requires no additional set up.
Page You
This function allows the caller to page you for a real
time chat.
When the caller pages you, you'll hear a beeping sound
and there will be a short message on the screen telling
you that so and so is paging you.
To answer the page, press 'C' (Chat). If you press any
other key, the page process will terminate.
The Node.ini file contains 7 fields, one for each day of
the week. Each field allows you to specify the starting
time and the ending time for paging along with the name
of a file to show when a caller tries to page outside of
those hours.
Osiris SE Technical Reference Manual Page 13
The Chat function has TWO modes, ANSI and NON-ANSI. The
NON-ANSI mode is ONE way. ONE way means that only one
person can type at a time.
TWO way means the display screen will split in half with
two windows, the top for you and the bottom for the
caller. You can both type at the same time without
overwriting the each others text.
The Chat function has 4 special keys. Two that can only
be used by you and two that can be used by you and the
caller.
ESC (You) - Ends chat mode and returns the caller to the
main menu.
Ctrl-L (Either Party) - Clears that parties window, if
in TWO way mode).
Ctrl-R (Either Party) - Clears the screen and redress
the windows.
ALT-P (You) - Causes the current screen to be dumped to
a text file called "CHAT.DMP," a screen snapshot.
If 'CHAT.DMP' already exists, the snapshot will be
appended to it.
Change Set-Up
This takes you to an area that allows you to change
certain user record setting.
Version
Shows which version of Osiris you're running. I'll
also display the type and version of DOS you're using
and the type of multi-tasking software, if any.
You also have the option, if you're running a Network,
of having the name of Network Software/Hardware shown.
Just make a text file called "Network.def." It should
contain the name of the network you're running, use only
ONE line.
Total available memory, conventional and EMS, will also
be displayed along with the amount left. Conventional
memory doesn't reflect what you might think it does. DOS
will attempt to give any program that loads 1 million
bytes of memory, whether it needs it or not.
Osiris SE Technical Reference Manual Page 14
That means the program may be assigned a lot more memory
than it actually needs to run. If less memory were
available, (TSR, Disk Cache, etc.) the program would
still run.
Who Is On-Line
Displays WHO is on-line at the same time you are.
This feature will not work on single line systems.
The Who's On-Line Display would look like:
(#) Status Caller
___ ___________________ _____________________
1 In External Program John Doe (City State)
Possible Status Messages:
No Caller This Node
Unavailable for CHAT
In External Program
Available for CHAT
Transferring a FILE
I'll handle changing the status line internally EXCEPT
when you're in an SPL/I command file.
When in an SPL/I file that may keep the caller away from
one of the primary menus for an extended period of time,
you should manual change the status line with the SPL/I
command _SET_NODE_STATUS().
Callers not wishing to have their names displayed will
always show up as "No Caller This Node" and any SPL/I
request to change that status will be ignored.
Unavailable for CHAT, Transferring a
FILE, and In External Program does NOT
stop another node from SENDING Email
since that Email will be held until the
node IS able to receive it. Only 'NO
Caller This Node' will PREVENT anyone
from sending Email to that node.
Message Center
This is where you can find all private messages between
individuals on the system. You can read, reread private
message, or enter private messages from this area.
Osiris SE Technical Reference Manual Page 15
The Message center also has a NEW mail check, triggered
during the log-on process, that automatically scans for
NEW mail addressed to you. If you have mail, I will
display the message and you have the option of REPLYING.
When you enter a message, you have the option of sending
CARBON copies of the message, up 30, to other
individuals. You also have the option of having ME
notify YOU when addressee receives the message.
The Message Center has its own internal SHORT menu
system that's very functional:
Msg # 1 [1 .. 386] [R]eply, [N]onStop, [H]elp, [D]isplay Current,
[-]Reverse Direction, [I]ndividual, [E]nter, [T]hread, [Q]uit,
[ENTER] for Next Message :
[I]ndividual
Let's you enter a MESSAGE NUMBER and
providing it is TO you or FROM you, I'll display
it.
[T]hread
If the message is THREADED, has replies or is a
reply to another message, you can go to the THREAD
system and follow the conversation threads.
From the THREAD menu you have:
Msg 274 [1...399] [R]eply,
[-] Reverse Thread Direction, e[X]it Thread,
[ENTER] for Next Message:
You will only be shown messages in the THREAD that
are TO or FROM you.
I'll save your CURRENT message location BEFORE you
enter the THREAD system. When you exit the THREAD
system, I'll place you back on the original message.
File Attaches
If you have access, you can add file attaches to
the message center messages.
I will restrict the name of the file to the DOS 12
character limit, no path designator will be
allowed, and ALL files MUST be in the directory
"UPLOADS,", a sub-directory in the OSIRIS=
directory, this is the message attach staging area.
Osiris SE Technical Reference Manual Page 16
Osiris will automatically create this directory,
providing you're ON-LINE. If you're going to attach
a message locally, with Sphinx, and the directory
doesn't exist, you'll have to create it manually.
If you're entering the message locally, with
Sphinx, you will have to copy the file to the
staging area.
If you're a caller, you will HAVE to upload the
file you want to attach to the message. I will NOT
allow you to attach a system file, a system file is
a file listed in one of the file areas, to a
message.
I'll place the file you've uploaded in the staging
area and as soon as the addressee downloads the
file, I'll delete it.
NOTE: CAT will NOT remove any message that has an
active FILE ATTACH.
Download
This is the same as the download command in the file
areas with one small change. If you use wild card
characters, you will not have the option of restricting
the matches to a specific file area.
User List
Displays a list of the current callers to the system.
You can enter a search string if you're looking for a
specific name. The search is a basic slide match and
CASE is unimportant.
Example: JO would match John, Jones, Joe, etc.
Pressing <Enter> will give you a complete list.
Callers not wishing to have their names and places of
origin shown will have PRIVATE LISTING and XXXXXXXX used
in place of their real name and place of origin.
Store
This takes you to the ON-LINE STORE(tm). If you don't
intend to use this, set the access level to 32722 and
don't list a command key for it. See the section on
ON-LINE STORE(tm) for details on setting up and
operating the store.
Osiris SE Technical Reference Manual Page 17
Statistics Subsystem
You'll find several statistical options located in this
section.
Todays Callers
This will display a list containing the names of
the people that called your system TODAY. The list
contains the name of the caller, where he called
from, when he logged on, when he logged off, and
the total time spent on-line.
Callers that have the privacy switch turned on, no
user list display, will not be shown but will still
be counted.
At the end of the list; the total number of calls,
total minutes of in-use time, and the percentage of
utilization, based on 1440 minutes.
Who Called Yesterday
"Who called yesterday" functions the same as
"Todays callers," but shows only yesterdays
callers.
Caller History
Caller history shows a screen listing all the
callers to your system for the last 14 days, if
available. I will use a date bar to divides each
group of entries.
At the end of the list; the total number of calls
within that 14 day period, the total number of
minutes used, and the AVERAGE utilization.
NOTE: CAT takes care of the HISTORY logs for each
node and will automatically keep them trimmed back
to no more than 14 days. You don't have to do
anything.
Six Best Times To Call
Uses the history log for the current node to
compute the SIX less used HOURS and displays them
in less to most order. It also shows the average
in-use time for that hour.
This lets you pick the BEST times to call the
system.
Osiris SE Technical Reference Manual Page 18
Six Worse Times To Call
Does the same as the last display but shows the SIX
busiest hours when you should NOT attempt to call.
Quirk
Six Best and Six Worse times to call have a
small quirk that you may notice. It is
possible, highly probably, that you will see
BUSY HOURS with more then 60 minutes. Since
Osiris, and ISIS for that matter, round each
call up to the next highest minute, you may
get more than 60 minutes in a busy hour.
Top Ten Uploaders
There are two different charts displayed under this
option. The first is top 10 UPLOADERS to your
system, based on the NUMBER OF FILES uploaded.
The second is top 10 UPLOADERS to your system,
based on KILO-BYTES uploaded.
Callers with zero uploads will NOT be allowed in
the chart.
Baud Rate Chart
This TRACKS the SPEED of your callers.
Top Ten Downloads
A list of the ten most popular files on your
system. It might be helpful to new callers if you
have a LOT of files.
Protocol Graph
This graph shows which protocols are popular and
which are not. If your callers aren't using a
particular protocol, you may want to replace it
with one they will use.
Top Ten Dnloaders
Again, this option displays two different charts.
The first chart is base on the NUMBER OF FILES
down loaded- loaded. If you do not have enough
dnloaders to fill the 10 slots, the remaining
slots will be empty.
The second chart is based on the number of KILO-
BYTES down loaded.
Osiris SE Technical Reference Manual Page 19
Track Call History
You can input a name and list the dates, times, and
amount of time a specific person has called the
system.
Osiris SE Technical Reference Manual Page 20
This allows the sysop, or the caller, to track the
calling habits of individuals.
Specific History Date
This is almost like the TODAYS CALLER display
except you can enter the DATE you want to look
at. The available dates will be displayed
before you're asked to enter which date you want
to look at.
Track Individual
This option allows you to track the times a
specific individual called the system.
The display shows the name, log-in date, log-in
time, and the time spent on-line for that call.
If you want to track yourself, simply press return.
If you want to track someone else, backspace to
remove your name and type in the name of the person
you want to track.
I'll only list a person with the privacy switch for
the sysop OR that person.
After all the dates on-line have been displayed for
that person, I'll give you the total number of
connects and the total time he or she spent on-
line.
Total And Avg In-Use
You'll get a display showing the TOTAL calls, TOTAL
in-use time, the percentage of utilization, average
callers per day, average in-use timer per day, and
the average percentage of utilizations per day.
Top Ten Callers To The System
Lists the names of your ten most frequent callers.
Those with the privacy switch are excluded from the
chart.
Osiris SE Technical Reference Manual Page 21
Top Ten Message Posters
Lists the top ten people based on the number of
messages they have posted. Those with the privacy
switch are excluded from the chart.
File Area Statistics
This chart lists each file area, those you have
access to, along with the number of files, total
byte count, and total number of files downloaded
from the area.
After all the areas have been listed, the combined
number of files, bytes, and number of downloads is
shown.
Advanced Mailer/Remote Tnt
If you're using our advanced mail system, ISIS,
incoming and outgoing mail sessions will be added
to the history logs so in-use times will reflect
TOTAL in-use time.
All incoming Remote TNT users will be added to the
history log.
Inter Node Mail Room
Takes you to the internode mail room, sometimes referred
to as CB Chat, where you may send short, up to 5 line,
messages to callers on other nodes.
The HELP file for the internode email room is
"EMAIL.(ASC/MMU/ANS)" and resides in the text directory.
Ctrl-K . Exits Mail Room.
S ...... Send Inter Node Email Message.
L ...... List Who's on which Node.
J ...... Join a SIG.
Q ...... Quit SIG.
W ...... Who's in SIG with You?
A ...... List Available SIG areas.
C ...... Clear Screen Redisplay Command Options.
B ...... Browse through OLD Chatter for This SIG
^----(For the CURRENT day)
While you're in this area, you can wait for pending E
mail without fear of the in-activity timer throwing you
off line or you can send Email from here.
Osiris SE Technical Reference Manual Page 22
You don't HAVE to WAIT here for the Email. If you're at
any one of the 3 MAIN Osiris Menus, you will
automatically be alerted to any and all arriving E mail
messages. Once alerted, the message will be displayed
and you'll have the option of replying. If you're not at
one of the primary menus, I'll wait until you reach one
before breaking in with Email.
You can send Email to any ACTIVE node on the system,
either to a SINGLE node or a GROUP of nodes via the SIG
function.
Inter Node Email also has full function Special
Interest Groups often referred to as a SIG. You might
think of a SIG as a special conference ROOM for GROUP
conversations. It's up to you to install the different
SIG areas using the SIG option in OSM.
You can only belong to one SIG at a time. If you attempt
to join another, I'll remove you from the current Sig.
Belonging to a SIG is the only way you will be allowed
to GROUP send, send the same message to multiple
individuals, and I'll handle the actual sending.
If you leave the mail room, the talk got slow, you still
remain attached to the SIG and will automatically be
notified and shown any messages that come in.
I'll log all activity in a SIG, SIGxxx.LOG, and you can
BROWSE though the old messages, using the B option. You
also have the option of setting a specific starting time
for the browse.
There can be up to 128 DIFFERENT Inter Node
Conversations going on at the same time. Each node can
have up to 5000 un-read Email messages waiting.
A system may have as many as 32722 different SIG areas,
more SIG areas than available phone lines I'd wager.
User Defined Functions
The remaining 10 functions available from the main menu are:
Main1, Main2, Main3, Main4, Main5, Main6, Main7, Main8,
Main9, and Main10.
These are SPL/I command files, baring the same name as the
aforementioned functions. I expect you to use SPL/I to
PROGRAM these files.
All of the Main1 - Main10.(PRG) files should be located in
your text support directory.
Osiris SE Technical Reference Manual Page 23
Adding Conference Message Areas
A conference board is a message area defined for GROUP
conversations. It can be either a LOCAL area or an ECHO area.
Unlike the "MESSAGE CENTER," I do not allow private messages
and the conference newmail check is optional.
You will be required to define each conference message area
using OSM.
Your first step would be to go to an existing board and press
the C)lone key. Now press the END key, located on the keypad.
You're now positioned ON the new message board and you're
ready to edit. Press the E)dit key to begin.
Area Name
The first field is the area name. This is a description
field used to identify the area.
I don't use this field for anything and it's for your
benefit. I use the field "Area Number" for all internal
and external references.
Fragmented Area Numbers
I'll NOT adjust the area numbers so they are
contingent. If you don't have access or have an
area selected you may get a display that shows
areas 1 3 6 7 9.
Some smaller BBS programs will auto-adjust the area
numbers. But because of the possible areas, it
would require over 128,000 bytes of memory to
synchronize the area numbers in Osiris. Simply not
worth the additional overhead.
Area Access Level
Your access level must be equal to or higher than THIS
access level before you can get into the area.
Area Flag Settings
This allows you to sub-divide the access level by
specifying specific flag settings. This field has 8
flags and you can use any combination.
Osiris SE Technical Reference Manual Page 24
Flags, How They Work
All command keys on the Main, Message, and File
Area menus have 16 special access flags that can be
turned on, or off, in groups. File areas and
Conference areas have 8 special access flags.
Each User record has a special flag field for the
command keys.
Each group of flags offers some 65,535 different
combinations for 16 flags and 255 with 8 flags.
A set of command key flags will be comprised of 16
zeros(0) or one's(1). ,e.g., 0000000000000000 or
1100101011110010.
Zero means the flag is off, one means the flag is
on. If you and the command have the same flag(s) ON
, then you have access to that command, providing
the ACCESS level itself is ok.
Note that I said ON in the last paragraph . . .
only flags that are ON will be checked and I only
looks at the REQUIRED Flags.
100000000000000 may be a flag for the File
SubSystem command at the main menu. You must have
flag number 1 turned on to access that command.
If your flag field is 1000000000000010, flags 1 and
15 are on. I'll ignore flag 15 because that
command does not require it.
General Propose Flags
Each user record also has 16 General Purpose
flags for use in SPL/I command files.
16 flags offers 65,535 possible combinations.
Each user record has a specific flag field for
these flags and function the same as the
command key flags.
Area Flags
Each File board and each Conference Board have
a set of 8 flags offering 255 different
combinations to choose from.
They function just like the 16 flags except
there are only 8 of them.
Osiris SE Technical Reference Manual Page 25
Board Type
This defines the TYPE of area; local, echo, or
echo/pass.
Local
If you define a message board as LOCAL, you're
telling me the messages in that area NEVER leave
your system.
Echo
If you define a message board as ECHO, you're
telling me the messages will be removed from that
area and sent to someone else's system.
I will active special flags and other items to give
external programs additional support. The method
used to send the messages does not matter.
I need to make one thing perfectly clear, the term
ECHO is generic. It does NOT reference the area as
a Fidonet Echo area nor any other specific type of
Echo area and I will not place any default "Tear or
Origin" type lines in ANY message. If you're going
to set up an area that NEEDS those, your external
export program will have to supply them.
Echo/Pass
An Echo/Pass board is the same as Echo but, I
expect the external programs to remove all traces
of the messages once they've been moved.
Message Type
The 5th field is the Message TYPE: ASP, REV, ASP/ALIAS,
and REV/ALIAS. When you enter a message, the message
TYPE tells me whether or not to allow you to use your
ALIAS and it also tells me to either post the message
right away or to move it to a HOLDING area for review.
Asp
I will make message posted in an area defined as
ASP available for public viewing as soon as you
save it. Your REAL name will always be used in the
message FROM field.
Asp/Alias
This is identical to an ASP area except, I'll let
you have use your ALIAS.
Osiris SE Technical Reference Manual Page 26
Rev
REV means do not post the message for public
viewing but move it to a HOLD area so that it can
be reviewed (REV) by the area moderator.
The moderator has the option of P)osting the
message or R)ejecting the message. If you reject
the message, I'll send the message BACK to the
party that wrote it with the text body of
the rejection message containing the entire
header and text body of the rejected message.
You can't reply to Rejection notices and the
name used in the FROM field will be "Area
Moderator," to protect the moderator's identity.
Mod.ctl
If you define an area as REV, you must also
create a MOD.CTL file, in your Osiris root
directory.
The Mod.ctl file contains the area number and
a password, up to 8 characters. This allows
you to assign individual area moderators
that can work the system remotely.
Rev/Alias
This is the same as REV but, I'll let you use your
ALIAS.
Origin Line
The 6th field is "Origin Line." If you define the area
as ECHO, your external export program may need some type
of Origin line. Halcyon, one of my programs, does. The
section about Halcyon will tell you what the field is
for and what/what not to put in it.
If you don't know or aren't sure when you DEFINE the
area, skip the field until you know what you need to put
in it.
Full Help Menu Name
The 7th field "Full Help Menu Name" is the name of the
/ASC/MMU/ANS file to display when you have FULL help
turned on. You can use one menu for ALL area, different
menus for each area, or one menu for ALL areas EXCEPT
for special areas.
Osiris SE Technical Reference Manual Page 27
Pack Trigger Level
Field 8 is the "Pack Trigger Level" and CAT uses the
field to keep the number of messages in the area below a
specific level or number.
CAT takes the "Pack Trigger Level" and compares it with
the actual number of messages in the area. If the number
of messages exceeds the "Pack Trigger Level," CAT trims
the area down to the number of message defined in field
9.
The "Pack Trigger Level" can be any number ranging from
1 to 32722. I suggest you keep it high enough so it only
triggers a PACK once a week to cut down on drive
fragmentation.
Pack Level
Field 9, Pack Level. Cat uses this field to determine
the post pack message level.
Word Wrap
Field 10 "Word Wrap" tells me if HARD CARRIAGE RETURNS
should or should not be used.
HTMS echomail, Fidonet echomail, and LOCAL message
boards require a YES.
You should ONLY use the NO option if the area is to be
used in a network that requires HARD CR's (Pc Rely,
UUCP type networks).
Functions
The remaining twenty (20) fields pertain to certain
features/options available to the callers. All twenty
fields have three things in common; A command key
(single character), an access level (1 - 32722), and a
set of flags (16 of them).
NOTE: I do not currently use ALL 20 fields. If I do not
use a field, I will mark the field "OPEN." If you run
across a field marked "OPEN," set the command key to a
SPACE.
Area Change
Allows you to switch conference areas. Only the
area(s) you have selected will be displayed and
areas containing UNREAD messages will be flagged
with (*).
Osiris SE Technical Reference Manual Page 28
Please keep in mind that Osiris is CONFERENCE
based. That means simply ADDING new conference
message areas will NOT affect your area display and
only areas SELECTED will be displayed. I suggest
you use a system bulletin to notify your callers
about new areas.
Log Off
Allows you to log off the system with the option
of leaving the sysop a parting message.
New Mail
This triggers a CONFERENCE mail check for UNREAD
messages addressed TO you. There is also a log-on
OPTION, can be turn on from the change menu, that
will automatically scan for NEW CONFERENCE mail
each time you log-on. The LOG-ON Conference check
will also display a list of areas that HAVE unread
conference mail.
Only areas you have selected will be scanned and
only unread messages addressed to you will be
shown. You have the option of reading and replying
to any new message displayed and you can quite at
any time.
The conference new mail check is exceptionally fast
and can scan at roughly 15,000 messages per second.
Enter
Allows you to enter a message. If you defined the
area as a LOCAL message board, then you can ONLY
enter a message to someone on the system or address
the message to ALL. If you defined the area as
ECHO, you may address the message to anyone.
Any message entered in a CONFERENCE area is a
PUBLIC message and anyone may read or reply to the
message.
Main
Takes you back to the main menu.
If you entered the Conference message area from an
SPL/I command file, you'll exit back to the SPL/I
command file and NOT the main menu.
Osiris SE Technical Reference Manual Page 29
Confer.
This takes you to the conference message area
selection system where you can add, remove, or view
the areas you want to read.
You can select up to 49 message areas to read.
Commands (Hard Coded and May NOT be changed)
A)dd an Area
L)ist out all Available areas (those you have
access to).
D)elete an area out of your personal list.
M) List out the areas you have already selected.
"SETBOARD./ASC/MMU/ANS" is the FULL screen help
menu for the conference selection subsystem
Text
Displays the Text file ####./ASC/MMU/ANS. #### is
the area number for that message area.
The file can contain anything from a brief
explanation of the area to calling a complex SPL/I
command file.
The design and make-up of this file is up to you.
Gateway
Displays the Text file GATE_M.ASC/MMU/ANS.
Pack
Pack lets you to place un-read messages from a
single message area or ALL areas in an archive,
optional, and download it for off line reading.
You have the following options.
1. Starting message number. Pressing RETURN starts
with the CURRENT message.
2. The maximum number of messages to pack. Press
RETURN for up TO 500 messages, about 500,000 bytes
for a NON archived text file.
3. Type of archive. Zoo, Lharc, PAK, Zip, ARC, or
NO archiving.
Osiris SE Technical Reference Manual Page 30
Lharc uses Lharc, Zip uses Pkzip, Arc uses pkarc,
and Pak uses PAK, and Zoo uses Zoo.exe.
I do not, currently, support ARJ because the slow
compression time offsets the time savings. When Mr.
Jung releases ARJX, a faster version of ARJ,
support will be added to the PACK function.
If the download went OK, you have the option of
having the LAST READ marker set to the last message
PACKED for the area(s).
Since the TEXT file is in generic ASCII format, it
doesn't require special READER software and can be
used by anyone.
Bug? . . . No
The following often leads to some confusion
and does generate more "bug.frms" than
anything else.
There is only ONE download, send file,
function in Osiris. All internal Osiris
functions have to go though this function to
send files to the caller.
The send file function displays a prompt
telling you to press S to start, A to abort,
or G for goodbye after transfer.
Only S and A are valid and G will be treated
the same as S, START.
File Areas
Takes you directly to the Files Areas. It's useful
for those with elaborate ANSI Main Menus.
Message Center
This option accesses the MESSAGE CENTER from the
Conference message area.
[R]ead Command
Takes you to the READ messages system for that
area. From here the options will be displayed by an
internal menu system.
Osiris SE Technical Reference Manual Page 31
Msg 1 [1....1027] [R]eply, [M]ask, [H]elp, [D]isplay Current, [Q]uit,
[-]Reverse Direction, [I]ndividual, [E]nter, [T]hread, [G]oto Last Read,
[ENTER] for Next Message:
Items that were moved
to the read menu or
obsolete by the Mask
Sub System have been
left empty for future
expansion.
Those fields are
marked as OPEN in
OSM. You should set
them to SOMETHING,
a key you're not
using for one of the
other commands. Do
NOT leave the fields
blank.
[M]ask
The MASK Menu allows you to set message
FILTERS and toggle the TRACKING of the LAST
message read on and off.
If a message doesn't MEET the MASK
requirements, I'll skip it and go to the next
message until I find one that DOES match, or
until I reach the LAST message in the area.
[T]o
This sets the MASK so that ONLY messages
addressed TO a specific individual will be
display.
When you select this option, I'll ask you to
enter a persons name. I'll DISPLAY YOUR name
and if you want to use it, press RETURN.
Otherwise use the DEL key to erase your name
and type in the name you'd rather use.
Osiris SE Technical Reference Manual Page 32
[F]rom
This works like the TO mask but works with
the FROM field. Only messages FROM that
individual will be displayed.
When you select this option, I'll ask you to
enter a persons name. I'll DISPLAY YOUR name
and if you want to use it, press RETURN.
Otherwise use the DEL key to erase your name
and type in the name you'd rather use.
[A]ll
This resets the MASK to the default value and
I'll show ALL messages.
[P]attern
This is a VERY powerful function and one that
I find to be very useful. When you select
this option, I'll ask you to enter a text
string. This can contain ANYTHING that
might be found in a messages TO, FROM,
SUBJECT, or DATE field.
Unlike the TO and FROM masks, which require
a perfect match, the PATTERN mask only
requires that the pattern be IN the field(s)
SOME PLACE.
Suppose you entered "John" as the PATTERN.
Msg #2, From Field, has "John Doe." Msg #5,
SUBJECT field, has "RE: John Deer Tractors."
The pattern would match BOTH messages since
both messages have the word JOHN in it.
You can also use this on DATE fields and
display message posted in a specific month,
on a specific date, even at a specific TIME.
Keep in mind that message dates have the
format of DD MMM YY HH:MM:SS
DD is always TWO digits. If the day is less
than 10 (1,2,9) it will always have a 0
before it.
MMM is months and all months are 3 characters
long followed by a blank space.
Osiris SE Technical Reference Manual Page 33
[L]ast Read
Gives you the option of turning the LAST read
TRACKING system OFF and ON.
If you do set one of the mask options to
SEARCH for something, you MAY want to turn
tracking OFF so you cam jump BACK to the
original message without having to remember
it.
If you have toggled LAST read Tracking OFF and
you are going to be toggling it BACK on, I
would advise you to jump back to the last
read position, (G) option from READ menu,
before doing so.
Searching For Specific Messages
If you're going to SEARCH for a specific
message or group of messages.
1. Turn Tracking OFF.
2. Jump to message number 1 (I command from
READ menu)
3. Set Mask.
4. Exit Mask Menu.
5. Press RETURN.
When you have completed the search . . .
1. Turn Tracking ON
2. Set Mask to ALL
3. Jump to Last Read (using [G]oto Last Read
command)
[T]hread
If the message is THREADED, has replies or is
a reply to another message, you can go to the
THREAD system and follow the conversation
threads.
From the THREAD menu you have.
Msg 274 [1...399] [R]eply,
[-] Reverse Thread Direction, e[X]it Thread,
[ENTER] for Next Message:
I will save your CURRENT message location
BEFORE you enter the THREAD system and I
will return you to that message when you EXIT
the thread system.
Osiris SE Technical Reference Manual Page 34
Default.msg
With new callers, you MUST ASSIGN default conference
areas. You do this by building a text file in your
Osiris root directory.
To assign the default message areas, create a file
called "DEFAULT.MSG."
The format of this file is:
Area #
Area #
A single area number, one per line, with a maximum of 49
areas per file. The FIRST area you have listed will be
used as the "Default" area and that's where new callers
will be placed the first time they go to the message
system.
Example Default.msg File
1
2
4
5
This will give the callers default access to
message conference areas 1 through 5.
Final Step
Once you have defined a new conference message area, one
final step must be taken before you can access the area
from within Osiris.
Although you have defined the area, the physical
databases must now be created and only CAT.EXE can do
that.
Exit the OSM program and from the DOS command line run
the CAT.EXE program. CAT doesn't require command line
parameters but you may want to LOOK at the CAT.CFG to
see if you want any of the options changed.
Osiris SE Technical Reference Manual Page 35
Matrix(?)
Since most sysops, 95 percent, do not allow users to
send Matrix mail, I did not build a matrix type
conference board into Osiris.
I do have two stand alone modules that gives your
callers DIRECT access to your mailers matrix area. They
can be accessed from any place on the system via an
SPL/I command file.
It is up to you to decide if you want to provide matrix
mail and to pick out which of the matrix modules suits
your needs.
Imaxtrix.exe: Gives you direct access to the ISIS matrix
area.
MMSG.EXE: Gives you direct access to the mailer matrix
area in Binkley, Frontdoor, D'bridge, and others.
Osage
Osage is the Osiris ANSI message editor. To use it, you
must support ANSI Graphics and your terminal program must
support control keys. Most do, but there are some that do
not.
Osage also has DEC VT102 support for left, right, up, down
arrow keys as well as home, end, and ctrl-Home. All other
commands are Wordstar Compatible to lower the Learning curve.
A quick run down of available commands:
^E up line ^N split the line
^I TAB (10 Spaces) ^K? Dictionary
^X down line ^V insert space
^S character left ^Ky delete line
^D character right ^Ki insert line
^A word left ^Kx del to end of line
^F word right ^G Del Current Char
^Qd end of line Backspace Delete
^Qs start of line ^R page UP
^C page DOWN ^B reformat
^Kr redraw screen ^Qc Bottom of Msg
^Kd Done/Exit Editor ^QR Top of Msg
^Kq Quote text
Osiris SE Technical Reference Manual Page 36
Ascii Uploading Into Messages
I'll also allow you to UPLOAD your message using ASCII
uploads.
After you have entered the subject, I'll ask if you'd like
to upload using ASCII, press Y if you do. I'll then ask if
you want the text ECHOED as you upload. Normally you would
answer NO to this one. Having the characters echoed back
to you MAY mess up the protocol driver, if that's what
you're using.
To signal the end of the ASCII upload, you will need to press
Ctrl-X.
After you finish the upload and have pressed Ctrl-X, you'll
have the option of reviewing what you have uploaded. Be fore
warned, this review option does NOT have word wrap and a word
may be broken in half.
If the text looks ok, not counting any broken words on the
edge of the screen, then answer Yes to the next prompt.
If the text did NOT look ok, maybe line noise got in the
way, then answer No. If you DO answer no, you'll have the
option of resubmitting the text file.
Rules
There are several rules governing the make-up of the
text file you will be submitting.
1. It must be in ASCII format.
2. You may NOT use any high bit or graphic characters,
those over ASCII 127. Illegal characters will be
ignored.
3. ANSI graphics will simply not be allowed.
4. The file may not be larger than 10K.
Hard Carriage Returns
I'll store the messages in one long string and only use
Hard Carriage Returns to signal paragraph changes. Most
word or text processors will end each line with a
Hard Carriage Return. That means I have no way of
knowing if you REALLY wanted a carriage return or if it
was just the text editor.
For a hard carriage return to be retained, there must
be two in a row.
Osiris SE Technical Reference Manual Page 37
For the following examples, I will use <CR> to imply
hard carriage returns.
Hello all<CR>
I'm calling<CR>
to see if I<CR>
have any messages<CR>
I would format the message as:
Hello all I'm calling to see if I have any messages.
To place a BLANK line in a message, you will need
THREE <CR>'s in a row.
Example:
Hello all<CR>
<CR>
<CR>
I'm calling to see . . .
I would format it as:
Hello all
I'm calling to see.
To make COLUMN listings, the same rule applies.
Example:
Apples<CR>
<CR>
Guns<CR>
<CR>
MICE<CR>
<CR>
I would format it as:
Apples
Guns
Mice
Osiris SE Technical Reference Manual Page 38
Line Editor
For those that don't want to use OSAGE or UPLOAD the message,
you have the LINE editor.
It allows you to edit existing lines, insert lines, delete
lines, continue to add to message, list the message, abort
the message, and even do QUOTED replies.
Yes, QUOTED replies!
A QUOTED reply is where you REPLY to a message and IMPORT
sections of original message so the other person will KNOW
what you're referring to.
The LINE editor will allow up to 150 Lines of text, roughly
12K.
Message Handling Or Message Base Format
There are TWO popular methods of handling message bases.
Fido Style
The Fido style message, commonly referred to as MSG
format, consists of an individual message PER File. The
MSG format is a popular storage method because of the
safety factor.
The Fido style message system has two major draw backs.
It's slower than molasses in the winter and takes an
ungodly amount of disk space.
Hudson
The HUDSON style message base, made popular by QuickBBS,
uses ONE BIG file to hold all the messages. That means
it's fast and doesn't take up much disk space. That
addresses the two major problems the FIDO style message
bases had. But, the HUDSON message base is prone to
accidents like cross linked clusters, mangled echomail
messages, bad sectors, etc. IF ANYTHING goes wrong,
you've lost it ALL.
Osiris originally used a message base system almost like
the HUDSON system. But, I found after several years that
the message base failure rate was just too high.
Osiris SE Technical Reference Manual Page 39
The Answer
The answer to the HUDSON verses FIDO problem was to
combine the two methods to form a 3rd type of message
base. One that's fast, didn't take much disk space,
and wasn't prone to accidents like the HUDSON message
system.
The message handling method is unique, extremely
efficient, and very fast. I use two files to store
the messages for each area. One is a HEADER file called
HDRxxx.SYS, with xxx, replace xxx with the area
number, and the other is TXTxxx.SYS.
e.g., HDR1.SYS and TXT1.SYS
In fact, the method of handling messages has proven to
be so effective, that within the last few years, several
brand-X BBS', Maximus' Squash for instances, have
adopted our method.
The HDRxxx.SYS files contain the message Header
information such as: who wrote the message, the
subject, and several other important pieces of data.
The TXTxxx.SYS files contain the actual text for the
messages in that area.
Your HDRxxx.SYS and TXTxxx.SYS files can go anywhere as
long as you set the environment variable TXT=, in your
AUTOEXEC.BAT file, to point to them.
You can also SPLIT the HDRxx.SYS and TXTxxx.sys onto
separate drives or into separate directories by moving
the HDRxxx.SYS files and defining HDR= in the
environment.
Multiple Database structures, like the HDR/TXTxxx.SYS
files, offer all the advantages of the SINGLE database
structure, but offer addition advantages of safety as
well as the ability to use multiple drives.
Should something happen, you only lose a small part of
your message base instead of the whole thing.
Fidonet Style Echomail
Although Osiris doesn't directly support echomail, I do have
a set of echomail programs specifically FOR Osiris, Halcyon.
Osiris SE Technical Reference Manual Page 40
Halcyon is a TWO phase Conference mail processor. It imports
and dup checks on one pass and then exports on the 2nd pass.
Halcyon uses two programs to do this, Import and Export.
By using a TWO phase processor we take advantage of loading
data into memory only twice. We avoid the pit falls of
SINGLE phase processors, Qmail and QuickBBS, by avoiding the
creation of FRAGMENTED outbound bundles. Fragmented
bundles increase import time for those receiving echomail
from you.
Export
Export takes messages out of your conference
message area and moves them into archive bundles ready
to be mailed out to other systems.
Command Line
Export {*L *U /X /O} {/S /R /N} /AZone:Net/Node /CControl_file {/F, /M}
where
/S . . . Standard Scan. Retains ALL of the original
paths and seen by lines.
/R . . . REMOVE all Un-moved echo flags.
/N . . . Delete all path statements and seen by lines.
Should ONLY be used if Gating to a different network.
/F . . . Don't reset high-water markers nor mark
messages as scanned out.
/M . . . Maximum number of messages to export during
the run. Default is 32700 but can be changed with
this switch.
/A . . . You address in Zone:Net/Node format.
/X . . . Running in HTMSnet, uses a slightly different
Origin line more appropriate for HTMSnet Conference
mail.
/O . . . Use old style conference mail naming. Some
Older echo processors use a restricted echomail naming
system.
If you're sending echomail to one of these systems,
not likely, then you may need to use this.
Osiris SE Technical Reference Manual Page 41
/C filename . . . Filename of the control file to use.
/? . . . Check and see if enough file handles are
available for the number of systems you want to send to.
Export MUST be run from your TXT= directory. It will
go to your system files to find all control files, even
the ones you have defined on the command line.
Setting Up Export.ctl For Outbound Echomail
Building your export.ctl file is the first step.
This file will be used as the primary echo
control file by EXPORT.
NOTE: You may chose any name for this file that you
like.
Support Path
The first line of your EXPORT.CTL file
should say SUPPORT PATH
You have to obtain an echo link from someone.
Assuming you have done this, make sure you do
not LINK to anyone else for the same echo
area. This is vital!
You can PROVIDE links to other
people with the understanding that
they do not get the echo from anyone
else.
Assume you have a link to an echomail
area called "IBM." First, you have to add
a message board to OSIRIS to HOLD the IBM
echomail messages. Do this with OSM and
define the area as Echo.
Write down the area number, the one displayed
when you do an AREA change from within Osiris,
for that message area.
Add Listing
Add a line in your EXPORT.CTL file
for the IBM echomail.
Go to the end of the file. If it's your
first one, the line following the "SUPPORT
PATH" line.
Osiris SE Technical Reference Manual Page 42
The first item on the line will be the
area number. Let's use area number 22. Your
file should now look like this:
SUPPORT PATH 22
Enter Area Name
Enter the NAME of the echomail area. It is
critical that you use the LEGAL name for
that echo.
It is IBM for the purposes of this example.
Place ONE space following the area number
and enter the echo NAME.
SUPPORT PATH
22 IBM
PLEASE NOTE: the ONE SPACE is critical,
it saves considerable time when exporting.
Determine Archiving Method
Find out, from the person you're getting the
area from, what archive type he uses. This is
a critical item and should not be assumed.
EXPORT can use ARJ, PKZIP, LHARC, ZOO, and ARC
formats.
I use the Letters L, O, Z, A, and J to
tell EXPORT what to use for a particular
system.
The letters are:
L for Lharc
O for Zoo
Z for Pkzip
A for Arc
J for ARJ
The archive programs used to place
the messages in the above formats are
PKZIP.EXE, ZOO.EXE, ARJ.EXE, LHARC.COM/EXE
and PKARC.EXE.
Osiris SE Technical Reference Manual Page 43
They must be in the current directory OR
in a directory that's PATHED. See DOS
reference manual for an explanation on PATH
statements.
Get Network Address
Get, from the system your getting the echo
from, the network address he is uses when he
exports. You MUST list the full address in
ZONE:NET/NODE format. Assuming you are
getting it from Zone 1, Net 230, Node 300,
the correct EXPORT.CTL format would be:
1:230/300
PLEASE NOTE: There is a colon (:)
following the zone and the net number
and a forward slash between the net and the
node number.
Determine Priority
The PRIORITY, Flag Settings, of the
outgoing file-attached message, used to send
the archived echomail, must be defined.
In general, Fidonet mailers support CRASH,
HOLD, and NORMAL priority.
HOLD means your mailer will not place an
outbound call to drop the mail off.
CRASH means it will send it as soon as
possible.
NORMAL means to let your Mailers Event
Manager decide when it can be sent, this
is the recommended option.
HTMS mailers, Isis, supports CRASH and NORMAL
flags. Hold is not directly supported because
of the reverse nature of HTMS over FIDO.
ISIS uses something that's is far "STRONGER"
than a simple HOLD flag. NOD or NOT ON MY DIME
meaning this file or message will never be
sent if you're the one making the call. IF you
tell Halcyon that you're using ISIS and to use
HOLD on an echomail attach, it will use the
NOD flag.
Osiris SE Technical Reference Manual Page 44
I use three letters to indicate message
priority; C for crash, N for normal, and H
for hold.
For this example we will assume NORMAL
priority.
Putting the steps together and assuming ARC
formatted archives.
SUPPORT PATH
22 IBM AN1:230/300
NOTE: Be sure there is only ONE space
between the AREA name and the address.
You can now send/receive IBM
echomail from 1:230/300 using ARC
formatted echo bundles and have his
outbound echomail file-attach messages
flagged as Normal priority.
If another system wants to link into you, go
to step 4 and repeat the process to add it to
your list.
To add more areas, go to step one
and repeat the process.
Avoiding Echomail Errors
Use only ONE space between items in the
EXPORT.CTL file on a specific line. Using
more than one space will cause errors.
Each line must end with NO SPACES. If you
have extra spaces following the last entry,
it will be translated into 0:0/0
Don't leave BLANK lines in the EXPORT.CTL
file.
An error that seems to occur frequently is
MIXING archive formats for the same
system. In other words having the same
system defined as using ARC for one area
and PKZIP in another area. This will cause
you to lose messages.
Osiris SE Technical Reference Manual Page 45
Avoid listing the same system twice for the
same Echomail Area.
Getting the Echo Area NAME wrong. If this
happens, the messages will end up in the bad
message area.
Using the wrong Matrix Address.
ASK the sysop of the system you are
communicating with what address he uses to
SCAN OUT.
Some systems have multiple addresses, but use
only ONE for scanning purposes. If you're
expecting 100/504 and the system you're
getting the area from only uses that address
to drop off mail but SCANS OUT messages
using 100/1, then you'll end up with
BACKFLOW. BACKFLOW is where you send the SAME
messages BACK to the person that sent them to
you in the FIRST place. His system will see
them as DUPLICATES, we HOPE.
Export MUST be run from the same directory
you're message bases are in, that's the
directory defined in the TXT= environment
variable.
Config.sys
Export is VERY fast, compared to other echo
processors. To obtain some of this speed,
I had to design special file routines.
Because of the way they work, once I use a
file handle, it cannot be freed back to the
POOL for reuse until the program ends.
This means you have maximum number of
DIFFERENT Nodes you can send to during a
single run. This can be varied by a
setting in Halcyon.cfg, MAX SYSTEMS. By
default, the total number of DIFFERENT
nodes per control file is 20. If 20 isn't
enough, hope you have a LARGE hard drive, you
may increase the amount using MAX SYSTEMS.
Osiris SE Technical Reference Manual Page 46
As you increase the maximum number of
systems, you must increase your files=#
proportionally.
For the Default 20 systems, your FILES=
should be set to FILES=34.
This may vary depending on your hardware
setup. But you can test it using the /?
switch. It will tell you the number of
systems it CAN send to, verses the number
you want.
Import.log
Export will use, if it is available, a file
called "IMPORT.LOG", created by import.exe, to
control which areas it exports from.
This can get you into trouble if you happen to
use the /F and /R switches.
Since /R sets ALL "I NEED EXPORTING FLAGS" to
OFF, if you had messages in areas not listed
in the import.log file, those messages will
not be exported.
If you are using the /R and /F switches, place
"DEL IMPORT.LOG" in the batch file BEFORE you
run export.
This can increase your export time, but
guarantees that ALL messages will get
exported.
Again, If you use /R or /F, delete the import
log file before exporting.
Exporting And Multiple Line Systems
Although export does support file locking,
there are other concerns when exporting WHILE
callers are on-line.
When you use TWO export control files, you run
the risk of having someone POST a message
AFTER the first pass, but before the second
pass.
Their message will go out in the files created
with the second control file, but not with the
first.
Osiris SE Technical Reference Manual Page 47
The solution to this type of problem is to
divert any conference messages that may be
posted while you are exporting to the REV
holding area, even if you have NOT defined the
area as REV.
If you are going to export WHILE callers are
on-line AND you are using more than one export
control file, you'll need to call export with
the command line switch *L BEFORE you begin
the export process.
E.g., EXPORT *L
EXPORT ....Your FIRST run.
This engages a conference system DIVERSION
LOCK and causes all newly posted conference
messages to be diverted to the REV holding
area.
There WILL be a 5 second pause before
export EXITS when you use the *L switch, to
give all lines time to respond to the LOCK.
After you have finished exporting, you call
export with the command line *U.
E.g., EXPORT *L
EXPORT ....Your FIRST run.
EXPORT ....Your SECOND run.
EXPORT *U
*U will DISENGAGE the conference system
DIVERSION LOCK and newly posted messages will
be posted according to the area type.
You should periodically check and move any
messages that are diverted to the REV hold
area.
Import
Import takes messages out of archive bundles
and tosses them into the various echomail areas.
Import does NOT require any command line switches. It
gets all its information from the Halcyon.cfg file,
outlined later in this document.
Import supports SIX archiving formats; normal ARC,
PKARC, PKZIP format, LHARC, ARJ, and finally, ZOO.
Osiris SE Technical Reference Manual Page 48
Nothing needs to be done on your part except to
have the following programs in your OSIRIS= directory:
PKXARC.EXE (renamed from PKUNPAK)
PKUNZIP.EXE
ZOO.EXE
LHARC.EXE
ARJ.EXE
If all attempts to unbundle the archive fail, I
will assume the bundle is bad. If that happens, I will
rename the bundle to HHMMSSXX.BAD and leave it for your
personal attention.
IMPORT MUST be run from your TXT= directory. It will
go to your OSIRIS= directory to find all control
files such as ECHO.CTL, sysinfo.qbs, newmail.sys,
etc..
Dups
Import checks the newly arrived messages to see
if you've already seen them. It does this BEFORE
you import the message which should save a little
disk fragmentation.
Import uses an EID duplicate checking system.
It's the most reliable method to date for
controlling duplicates.
Import will track the last 2000 messages in each
area with a fixed dupXX.dat file size. The file
will never grow nor shrink so the file will stay
contingent on your hard drive.
Backup System
The Dups checker has a backup high-speed CRC
system for messages that does not have an EID.
These are few and far between, but they do
exist.
Import's Echo.ctl File
This file provides Import with the information
needed to determine which ECHO AREA goes in which
Osiris message area.
Osiris SE Technical Reference Manual Page 49
The lay out of the echo.ctl file is pretty straight
forward.
Area# Conference_NAME
Area# Conference_NAME
I have reserved the first line of the Echo.ctl for
future use and you HAVE to use "0 PRIMER LINE" as
the VERY FIRST LINE.
Sample Echo.ctl
0 PRIMER LINE
3 COLLEGE
4 HPOLITICS
6 TREK
7 VIETNAM_VETS
8 VET_REUNION
9 HST
10 WORLD
11 HTMS_SYSOP
12 AI
Common Error
A common, and fatal, mistake is padding echo area
names with spaces. In other words:
7 VIETNAM_VETS<SPACE>
Import will see the area name as "VIETNAM_VET " and
not as "VIETNAM_VET" and any echo coming in for
"VIETNAM_VET" will be placed in the bad message
area.
This mistake can be a very hard to spot because a
trailing space will not show up in your text
editor.
The easy way to find this type of error is to use
Pctools File Editor, Norton will work, in HEX mode.
Spaces will show up as 20H.
Best way to avoid this type of error is to use a
text editor that doesn't end lines with spaces.
Edwin and Sidekick are good control file editors
while Qedit and Edlin are not.
Don't get me wrong, Qedit is a good editor. It's
just not good for control files.
Osiris SE Technical Reference Manual Page 50
Import Em Cache
Import has its own internal EMS/LIM 4.00 cache that
is hundreds of times more effective than your
traditional disk cache.
I have the advantage of knowing in advance what
data is likely to be needed again and I'll only
cache that data. I'll ignore data that isn't going
to be needed again. This accounts for its higher
than normal hit ratio, generally around 90 percent.
Since I know what should or should not be cached, I
can bypass the system read/write requests and go
directly to the cache. This allows your normal disk
cache, if you are running one, to retain data
longer than it normally would.
The import EM cache is an expandable cache. Unlike
traditional caches, I'll expand the size of the
cache when I need more space. I'll start with 0
bytes and expand the cache up to 4 million bytes.
If no space is available, I'll use a "LESS USED"
algorithm to determine which block to replace with
the new data.
If for some reason you do not want Import to use
the cache, add NO_CACHE to the import command line.
E.g., Import No_cache
Cache Statistics
At the end of an import run, I'll display the
EM cache statistics; Memory used for cache,
number of read requests, number of write
requests, number of reads actually done,
number of writes actually done, read hit rate,
and write hit rate.
The number of read and write requests do not
reflect ALL read/write requests. They only
reflect read/write requests for data I would
normally cache. I ignored read/write requests
for data I would not normally cache.
Disk Space
I an not going to waste time monitor disk space and I'm
going to just assumes you've got enough to get the
job done. If you run out, Halcyon is as good a
place as any to Stop. If you're out, nothing else on
your system is going to run. I will not even be able to
write an error log so . . .
Osiris SE Technical Reference Manual Page 51
Speed Tips
There are several things you can do to decrease
your processing time.
Have Export store the temporary PKT in the Osiris
TXT root directory. Dos gets very slow when it
has to work across directories and even S L O
W E R if it's across drives. Use PKzip for
outbound storage, if at all possible. It's by far
the fastest. Export only one time per day and find FEEDS
that will do the same for you. This will greatly
reduce YOUR import time . Don't use the /M setting
unless you just plain have to. Your archive time
will go down a tad, but the time to break off and
pick back up will more than offset it. RUN A DISK
CACHE!!! Set it to 128K, no larger, and lower your
BUFFERS= statement in your config.sys to 10. Yes, I
did say 10. Use a Disk compression program like OPTUNE
(By far the best) with FULL DEFRAGMENTATION and
FILE REALIGNMENT twice a week.
Keep your Hard Drive partitions as small as possible.
Smaller partition run faster than large, over 30 meg,
partitions.
If you have a LOT of message areas, over 150, then move
the HDR files to a different directory.
To do this define HDR= in the environment.
If you have less than 150, don't do this or the Dos
cross directory file slow down will make it even slower.
Halcyon.cfg
The final setup is to configure the Halcyon.cfg file.
Import and export get needed information from this file.
Enclosed is a sample.cfg file showing what a
Halcyon.cfg looks like. Below is a step by step run
down of the configuration options.
Osiris SE Technical Reference Manual Page 52
The centered text is a halcyon.cfg option. You follow
each option with the required information, if any.
Place one blank space between the command line text
and the data.
Use Ems
This tells me to map to EMS when I call an archive
program such as Pkunzip or Lharc.
If you do not have EMS or do not want it used, I'll
map to DISK.
Bypass Security
Traditional import programs will "ASSUME" that
anything that isn't an echomail message is a matrix
message and that message will be tossed into your
mailers matrix area.
That in itself is boggiest and not all "UNKNOWNS"
will be matrix messages.
This also leaves you open to those that may wish to
cause you problems.
Fidonet mailers, all of them we've tested, have a
security gap large enough to drive a train though
in this area. It is possible to trick the mailer
into forwarding matrix messages, attaching files
(even user records), and other items without your
consent.
ISIS, an HTMS/FIDOnet mailer, has internal security
systems to prevent this by disallowing matrix
messages in echomail archives. You can bypass those
security systems by using this switch.
Warning, using this switch will void your ISIS
warranty.
Osiris SE Technical Reference Manual Page 53
Max Cache Size
This determines the maximum size the EM import
cache.
Valid sizes range from 10 to 200. Each increment is
equal to 16384 bytes. E.g., Max cache size 10 would
equal 163840 bytes. EMS can only be allocated in
16384 byte blocks.
Example : MAX CACHE SIZE 200
Ems Handles, Very Important
In order for import to use an EXPANDABLE, on
demand cache, each block uses 1 EMM Handle.
Your memory manager should be set to allow MAX
CACHE SIZE + 10 EMM Handles. Almost all memory
managers have a default of 32 or 64 EMM
handles, but do allow you to increase the
number of EMM Handles with a command line
switch. QEMM uses HANDLES=, AST uses PID= and
CONTEXT=. Check the manual that came with your
memory manager for the correct switch
settings.
The program EMCHECK.EXE will tell you how
large MAX CACHE SIZE can be for your current
settings. Just run it, no command line
switches needed.
No Em Cache
If you do not want import to use EMS caching, add
this command. This will drastically reduce your
import speed so it is not recommended, but it is
available.
Maximum Memory
This tells me you're running with less then the
ideal amount of memory and that you REALLY need all
that can be squeezed out of the machine. You almost
always will need this switch if you are running in
a DV window.
Matrix Address
Import Echomail addressed to this address. You can
define up to 10 of them.
e.g., MATRIX ADDRESS 902/1
Osiris SE Technical Reference Manual Page 54
Common Mistake
There are several common mistakes associated
with these addresses.
One is to include the zone number. Do NOT ADD
THE ZONE NUMBER. Use _ONLY_ your net/node
number.
Do not use your HTMS address, if you're using
ISIS.
Tear Line
Use the following text as the TEAR line.
e.g., TEAR LINE Halcyon 3.01
Point Net
Define a POINT net address. When export I'll take
this address and strip it from the CURRENT seen
by lines.
e.g., POINT NET 25202
Htms Address
Define an HTMS address. Used only if you are
running ISIS.
e.g., HTMS ADDRESS 13143346359
Archive Directory
I'll store all outbound ARCHIVED bundles in this
directory. Useful if you are low on disk space and
wish to split things between two drives.
e.g., ARCHIVE DIRECTORY C:\lynx\arcmail
Msg Format
I'll use MSG file attaches instead of the default
HTMS file attach messages. For use with systems
using Binkley, FD, D'bridge, etc.. (NOTE: I do not
support OMMM style bundles).
e.g., MSG FORMAT
If you are running Binkley, I'm afraid you might as
well stop right here. Although I know of folks
using Binkley and Osiris, it's just not worth the
trouble.
Osiris SE Technical Reference Manual Page 55
Binkley is one of those programs that has an
identity problem. It doesn't know if it's a
terminal program or a mailer and ends up not doing
either very well.
Outbound Msg Directory
I'll place the HTM or MSG file attach messages
in this directory. Once again, I'm not
referencing OMMM style bundles.
e.g., OUTBOUND MSG DIRECTORY c:\email
Inbound File Path
I'll look in this directory for inbound arcmail
bundles. Keep in mind, I expect all echomail to
arrive in archived format.
e.g. INBOUND FILE PATH c:\fidonet
Pkt Temp Storage
I'll place the unarchived PKT files in this
directory until it is time to move them into the
archive.
Useful if your disk space is a little on the low
side. You might want to store the PKT files on one
drive but when it comes time to archive them,
archived to a different drive.
e.g. PKT TEMP STORAGE D:\
Dup.dat Storage
Tells me which directory the DUPxx.DAT files
will be stored. Useful if you need to spread
things across two or three drives.
e.g. DUP.DAT STORAGE c:\dups
Max Systems
Lets you increases the number of individual
systems support during a single export run. The
default value is 20 systems and does not require
the use of MAX SYSTEMS. The upper limit for MAX
SYSTEMS is 99.
e.g. MAX SYSTEMS 45
Osiris SE Technical Reference Manual Page 56
Unknown Save Area
Any message that I don't UNDERSTAND; an undefined
area, MATRIX message, or grunged messages will be
placed here.
This should point to your MAILER matrix area and
I'll save the message either in HTM format or MSG
format, depending on the TYPE of mailer you are
running.
Matrix Ending Up Here
One of the most common questions is WHY does
my Matrix mail end up here?
There is basically no difference between a
Matrix message and a grunged message.
I.e., there are no special "Designators" used
to set matrix and echomail apart.
You should never send matrix mail inside of an
echomail archive for several reasons.
Reason1: The destination system MAY be running
secure echomail and if he is, you will not
know that your message did not arrive.
Reason2: With MSG based message systems, you
can safely assume certain things, grunged may
not be grunged but matrix. If you're wrong,
you only lose a single message.
With nonMSG based message systems, you cannot
afford to make those types of assumptions.
A wrong guess can destroy hundreds or
thousands of messages.
Reason3: There are several security issues
involved that I'd rather not go into because
of their delicate nature. Let us just say that
all kinds of hell can be raised by those with
less than honest intentions.
There are a couple of popular echomail
programs, qmail is one, that assume
unidentified echomail is matrix mail.
Osiris SE Technical Reference Manual Page 57
They claim it as a feature, but it is really a
giant hole in their logic that can be used to
reek havoc on those using it.
Formatting
Spaces are NOT important within the HALCYON.CFG
file as long as at least ONE space is there. CASE
is not important. I'll ignore blank lines as well
as anything following a semicolon.
Echo/Pass
I'll automatically clear an area as soon as I finish
exporting its messages, providing you have not used the
/F switch. This will free up disk space as you process
and your PKT files become larger.
Seen By Lines
Halcyon supports FULL seen by lines in or out as well as
sub-sets. I'll not tamper with existing seen by lines
except to remove any point net listings you've
defined. I'll automatically remove any NET ZERO ie. 0/9
or 0/0 entries as non-valid.
Quad Already Seen System
I use a QUAD Already Seen it system instead of the
traditional single phase seen by line approach. Which
means import is 4 times more accurate when it comes
to stopping duplicate traffic than Confmail 4.0 or
Qmail.
This makes Halcyon, combined with the FILTER options,
the blazing speed, and the EID dup checking the best
Echomail processor you could possible run.
Origin Lines
Osiris no longer directly supports ANY type of
echomail, although I have provided HOOKS for external
processors such as Halcyon.
You'll find, in each message area, a place to define
an ORIGIN line for the area.
You use an ORIGIN line to show WHERE the message
originated. You should place the NAME of your BBS, City
and State, and the PHONE number, providing there is
room, in the origin line.
Osiris SE Technical Reference Manual Page 58
e.g.
VetLink #3, Cape Girardeau, Mo. (314 334-6359)
Do NOT add ZONE:NET/NODE information. Halcyon will
automatically include it in the proper place.
Databases
Neither Import nor Export can CREATE missing message
database files. Both programs demand the HDRxxx.SYS
and TXTxxxx.SYS files exist.
I'm not going to validate or trap for missing
databases. The VERIFY option, in OSM, and CAT can be
used to create missing databases.
Attempting to import mail into non-existing message
bases can result in system lockups, spraying parts of
the message on the screen, and other "weird"
happenings.
Error Reading/Writing Record 0
This is a BTREE index error which means I couldn't
FIND the ISIS nodelist.dat and nodelist.idx files,
the ISIS primary nodelist.
These two files MUST be in the OSIRIS= directory.
If you're running ISIS out of a different
directory, copy these two files to the OSIRIS=
directory.
Traffic.exe
This is an additional program that will allow you to
view incoming echomail activity. How much, where, when,
and who. Just run it, no command line switches needed.
Readarc.exe
I'll track the compressed byte amount for each system
that I send to. This can be used for shared billing when
one system retrieves echomail for multiple systems in
the same area.
Readarc.exe takes the archive.log and compiles the total
statistics for each system and then prints it to the
screen.
Osiris SE Technical Reference Manual Page 59
DOS redirect, can be used if you want to have it written
to a text file.
e.g. readarc > results.txt
Ulink
Ultralink is an OSIRIS SE conversion linker that
links messages that did not originate on your system.
The MAXIMUM number of message I can link in any given
area is 5000.
Ultralink looks small and doesn't require much memory
when it first starts, 80K, but it can quickly consume
a large chunk of memory. It can require as much as 512K
on areas that push it close to the 5000 message limit.
To use Ultralink you must be in the directory that
contains the HDRxx.SYS files and your OSIRIS= must be
defined so I can find you msgboard.qbs file.
I'll display the name of the area I am currently linking
along with the number of messages in that area. When I
have finished linking all the areas, I'll display the
TOTAL number of messages scanned and the elapse time in
seconds.
If I find the file IMPORT.LOG, created by import.exe,
I'll use it to limit linking only to areas that received
new echomail. That means run Ultralink directly AFTER
import.exe and but BEFORE export.
Ultralink can also accept one command line switch, /M.
This tells me you only want the message center messages
linked.
Sphinx!
As the SysOp, you will need to be able to READ messages
easily and have MORE control than the average user.
Most BBS' packages require you to LOG ON locally to read mail,
how quaint.
Sphinx! is an Osiris compatible sysop editor for message
reading/editing.
Osiris SE Technical Reference Manual Page 60
Sphinx! really needs a mouse, but can be used with HOTKEYS.
You will also need roughly 384K of free memory.
Sphinx! will READ your video adapter and switch between COLOR
and B/W mode depending on which video adapter is active.
Display.dat
Display.dat MUST be in the current directory. This is
the Sphinx primary display screen. See sub section on
color for an explanation on how to configure the
primary display colors.
Sphinx! requires ONE command line switch, the USER record to
load and use. The switch /U or -U, case is NOT a factor,
followed by the record number. Remember, user records start
with record number ZERO (0).
e.g. sphinx /U0
Load the first or record #0. This is usually your record.
You can run Sphinx! from any directory or drive but I do
recommend you call it in your Osiris ROOT directory for
maximum speed.
I have divided the primary display screen into four areas.
The first area, at the top of the screen, consists of two
rows. The first row is the name of the area you're in. If the
message center then "Osiris Message Center." If you're in one
of the conference areas, the name of that area will be
displayed.
The Second row contains the message Attributes for the
current message; Received, Deleted, Return Receipt Requested,
etc.
The second area contains information about the current
message; who it is to, who it is from, and the subject. At
the END of the subject line, you'll see two sets of numbers
separated by a forward slash '/'.
e.g. 6/235
The FIRST number, 6, indicates you're ON the sixth message.
The SECOND number, 235, indicates the LAST message in the
current area is number 235.
The area, located slightly off center on the lower 2/3rd's of
the screen, is the message text window.
Osiris SE Technical Reference Manual Page 61
There are several special sub-windows located on the outer
parameters of this window.
On the bottom horizontal double line border; Chain Original
and Chain Reply.
Either of these options may be selected by clicking on them
with the left mouse button or pressing the HOTKEYS (- or +),
respectively. In order for - and + to work, the message has
to be linked with other messages in a conversation chain.
On the right side of the window there are two SQUARES located
on the vertical double border, one at the top and one at the
bottom.
Provides a method of quickly jumping to the top or the bottom
of the current message. Click, with the left mouse button, to
select. HOTKEYS Ctrl-PgUp and Ctrl-PgDn may also be used.
The fourth primary window, located on the lower half on the
far right hand side of the screen, contains several options
which can be selected by pressing the left mouse button.
Below is a list of the options, their purpose, and the HOTKEY
that can be used.
Function Purpose HOTKEY
-----------------------------------------------------------
Enter Enter a New Message E
Reply Reply To Current Message R
Kill Kill The Current Message K
DOS Jump To DOS D
Exit Exit Sphinx! ESC
Menu Access Special Sphinx! Options M
First Jump to FIRST Message in Area HOME
Last Jump to LAST Message in Area END
<-- Move Back a Message LEFT ARROW
--> Move Forward A Message RIGHT ARROW
Up Arrow Scroll Message Window Up A Line UP ARROW
Dn Arrow Scroll Message Window DN A Line DN ARROW
PgUP Scroll Message Window UP 20 Lines PgUp
PgDN Scroll Message Window DN 20 Lines PgDn
Help Displays a small Help window ALT-H
Osiris SE Technical Reference Manual Page 62
Page Intentionally Left Blank
Osiris SE Technical Reference Manual Page 63
Message Center
The MENU option, from the Message Center, offers 4
additional options.
To select one of the options on the MENU window, move
the mouse cursor to the row containing the option you
want and click the LEFT mouse button. A box will
appear around the selection to indicate that it
is TAGGED. Once you're satisfied with the
selection, click on the TAGGED BOX again.
There are TWO methods of CANCELING your current
selection. You can move to a different selection and
click on it or you can click your RIGHT mouse button
and return to read mode.
Below is a list of the options and their
purpose. I associated each function with a HOTKEY
using the "first come, first serve" principle,
starting with 'A' and ending with 'Z'.
Print Current Message To A Text File
You have the option of using the default,
MSG.SAV, by pressing RETURN or clicking the LEFT
mouse button. You can clear the field, ESC or
Middle Mouse Button, and enter a new name. The
current message will be written or appended to
this file.
Print Current Message To Printer
This is the same as the previous option but
instead of writing the message to a file, I'll
write it to your printer.
You have the option of use LPT1 by pressing
return or clicking the LEFT mouse BUTTON. You may
clear the field ,ESC or Middle Mouse Button,
and enter a new printer port. Use the format
LPTx with x being the printer port.
Supported Printer ports:
LPT1 LPT2 LPT3 LPT4 LPT5 LPT6 LPT7 LPT8
Conference Message Areas
Takes you to the Conference Message Areas, this is
where we keep the public/echo messages.
Osiris SE Technical Reference Manual Page 64
List Headers
Displays a list of the message headers in the
current area.
I'll ask you for the starting message number,
pressing return or clicking the LEFT mouse button
will accept the default. Use ESC or the Middle
mouse button to clear the field or any of the
normal editing keys to chance the starting
number to the one you want. When the starting
number suits you, press RETURN or click the LEFT
mouse button.
You'll have to specify which of the three header
field you want me to display. Given the volume
of text, it is not possible to display all
three fields. You can select either: To, From,
or Subj. Move the inverted bar to the field you
want, using your mouse or the UP/DN arrow keys.
Click the LEFT mouse button or press RETURN to
select.
The display window will hold up to 20 message
before requiring you to signal either JUMP,
CANCEL, or MORE. You'll know when it needs
input, you hear a short sharp beep.
To select one of the option, move to the BOX
(JUMP, CANCEL, or MORE) and click the LEFT mouse
button. You may also HOTKEY the selection using
the first character i.e. C, J, or M.
If the beep sounds and the window isn't full, it
means end of messages. Select either the MORE
or JUMP to continue.
JUMP allows you to go directly to the TAGGED
message. It will ABORT the listing, return to the
area, and display the message.
To TAG a message for JUMP, move the mouse cursor
to the line containing the message you want to
jump to and click the RIGHT mouse button. An
inverse bar will highlight your selection. Move
to the JUMP BOX and click the LEFT mouse button.
If you accidentally TAG the wrong one, click
on it again.
Osiris SE Technical Reference Manual Page 65
If you have TAGGED a message, but click on the MORE
BOX, your TAG will be cleared.
I'm sorry, but this function will ONLY work if you
have a mouse.
TAG/JUMP will REMEMBER the message you have
JUMPED TO and if you select to LIST HEADERS
again, and you're still in the same area, I'll
present you with the next highest message number
as the default starting message number.
This allows you to jump quickly down the list
viewing messages from, to, or on any specific
subject/person.
The OK box HOTKEY is O
The CANCEL box HOTKEY is C
Mark
Marks the current MESSAGE you're on. This is
useful if you need to hunt down a message
that may contain information related to the
message you're reading. After you find the
message, click on restore to return to where
you were.
Restore
Returns you to the LAST MARKED message.
Search
Allows you to do an IF CONTAINED within text
search on the messages.
You have two options; Search the message headers
(TO, FROM, SUBJECT fields) or search the
BODIES of the messages.
You may use up to a 50 character search string.
When I find a match, I'll terminate the search and
place you on the message. To resume the search,
select the search option again and when asked to
continue, select YES. Selecting NO will allow
you to reset the search perimeters.
I do suggest that you MARK the current location
before beginning the search.
Osiris SE Technical Reference Manual Page 66
All the options listed above can also be
accessed by special HOTKEYS. Use the ALT-H, help
key, to list which functions can be accessed and
what their HOTKEYS are.
Broadcast
The broadcast option allows you to send the same
message to a GROUP of individuals.
You have four methods of broadcasting a message:
1. ALL. Sends the message to everyone listed in
the user.bbs file, excluding record 0, your
record. The TO field will have the users name in
it and NOT 'ALL'.
I can't think of a GOOD reason to broadcast to ALL
users when the system bulletins would do the same
thing and take less disk space.
2. By Access Level. Sends the message to everyone
that has access level XXXX or higher. You specify
the access level.
This could be used in place of the ACCxxxx.BBS
text file. It's more personal since it LOOKS like
you took the time to type in a message to each
person. The users will not know that you
broadcasted the message.
3. By Control File. This uses a TEXT control file
that lists the first and last name, one listing
per line, of each person you want the message to
go to. You MUST have the first AND last name
listed, single names will not work. There is no
limit to the number of names you can have listed
in the control file.
I'll ask you for the name of the control file and
if it exists, the message will be saved to
each individual listed.
4. Manual Control. This works like the control
file except you ENTER each person's name
manually. Again, there is no limit to the number
of people you can send to. To terminate the
process, press ENTER without entering a name.
Osiris SE Technical Reference Manual Page 67
When you select the broadcast option, you'll fill
out your message header like you normally would
except for the TO field, I'll skip this field
and fill it in myself once I find out which
method of "BROADCAST" you want to use. The
rest of the process is just like entering a
message to an individual.
Edit Current
This allows you to edit the CURRENT message, the
body only.
A word of warning, Osiris uses a PACKED
message structure. That means the next message
begins directly following the last BYTE or
CHARACTER of the last message. That means you
can't actual EDIT a message you've already
saved, it has a FIXED starting and ending location
in the message database.
When you edit a message, I'm basically saving the
body at a NEW location. The last or original body
is STILL in your message database and will remain
there until CAT packs the area.
Editing a LOT of message can cause your
message databases to grow at an abnormal rate and
you should use this function sparingly.
You may also HOTKEY this option by pressing 'A'.
Jumping To A Specific Message
You can jump to a specific message by entering
the message NUMBER.
When you type 1, 2, 3, 4, 5, 6, 7, 8, 9, or
0, a small window will open in the middle of the
screen and you may complete the message number.
When you press return, I'll jump you directly to
that message.
Set Personal Msg Pointers
This does what I refer to as "LOCKING DOWN"
specific messages.
If you select this option, I'll scan ALL the
messages in the area for unread message
addressed to you.
Osiris SE Technical Reference Manual Page 68
When you press the Left or Right arrow keys, or
click on them with your mouse, I'll move to the
NEXT or PRIOR message stored in the LOCK DOWN
queue, instead of the normal next/prior.
If you want to DISENGAGE the message LOCK before
you read the LAST message, press ESC.
Conference Message Areas
Having CLICKED your way to this section, your screen
will look almost identical to the one described above.
All the options listed above will also be available to
you from this section, plus a few more.
One option does work slightly different, EXIT. It takes
you BACK to the Osiris Message Center instead of EXITING
Sphinx.
Moderator
Lets you view messages in DELAYED POSTED (REV)
areas and either POST them or REJECT them.
HOTKEYS for POST and REJECT are: P R
If you REJECT a message, you'll have to supply
the reason. A menu will open in the middle of
the screen listing several default reasons.
Move to the one you want, using the mouse or the
up/dn arrow keys, and press RETURN or click the
left mouse button.
One of the default reasons is "Other." This lets
you enter your OWN reason for the rejection. The
reason will be limited to one line with a
maximum length of 50 characters.
Mass Print
This functions the same as the previous 'Print
Current Message To A TEXT FILE' except you print
a RANGE or GROUP of messages. You will be
required to provide the name of the file to
save messages TO, as well as the starting and
ending message numbers.
The default file name is "MSG.SAV" and can be
accepted by clicking the LEFT mouse button or
pressing RETURN.
You can also use the ESC or Middle Mouse button to
clear the field. Other normal editing keys may be
used.
Osiris SE Technical Reference Manual Page 69
Change Area
Allows you to SWITCH to a different Conference
area. A SIDEKICK type window will open listing
the available areas. Move the inverted bar to the
area you want and click the LEFT mouse button or
press RETURN to select. Pressing the MIDDLE
mouse button or ESC will abort the change.
The Change Area window will only display 20 areas
at a time. If you have move than 20 areas, you
can scroll the window by moving the inverted bar
to the FIRST or LAST entry and pressing the
RIGHT MOUSE button. Additional areas will
scroll up or down, depending on whether you're
on the FIRST or LAST entry. Holding the RIGHT
mouse button DOWN will cause a fast continuous
scroll. You can also scroll the window by
using the Up/Dn/PgUp/PgDn,HOME, or END keys.
The Area change display also sets the JUMP NEXT
Flag , option 9 on the menu. Once I've set the
flags, you can jump to the next message area
with UNREAD messages by click on JUMP NEXT. Each
time you change areas, with the CHANGE option, the
JUMP NEXT flags will be reset.
Mark
Marks the current MESSAGE. It's useful if you
need to hunt down a message that may contain
information related to the message you are
reading. After you find that message, click on
restore to return to where you were.
I'll save the current AREA and if you had to
change areas to search for a message, I will place
you back in the original message area.
Restore
Returns you to the LAST MARKED message.
Search
Allows you to do a IF CONTAINED within text
search on the messages. You have two options;
Search the message headers (TO, FROM, SUBJECT
fields) or search the BODIES of the messages.
You may use up to a 50 character search string. You
may also restrict the search to the CURRENT
message area or ALL areas. Matching Messages will
be added to a LOCK DOWN queue.
Osiris SE Technical Reference Manual Page 70
Once you have engaged the LOCK DOWN , pressing the
left or right arrow keys will move you to the
NEXT or PRIOR message that matched your search
string. If the message is in a different area,
I'll automatically change areas.
If you want to DISENGAGE the lock down BEFORE you
have read all the messages in the QUEUE, press
ESC.
Forward Conference
Allows you to forward the current message to
someone else in one of the conference areas.
Forward Message Center
Forward the current message to another individual
on the system and have the forwarded message
placed in the message center. Edit Current
This allows you to edit the CURRENT message, the
body only.
A word of warning, Osiris uses a PACKED
message structure. That means the next message
begins directly following the last BYTE or
CHARACTER of the last message. That means you
can't actual EDIT a message you've already
saved, it has a FIXED starting and ending location
in the message database.
When you edit a message, I'm basically saving the
body at a NEW location. The last or original body
is STILL in your message database and will remain
there until CAT packs the area.
Editing a LOT of message can cause your
message databases to grow at an abnormal rate and
you should use this function sparingly.
You may also HOTKEY this option by pressing 'A'.
Jumping To A Specific Message
You can jump to a specific message by entering
the message NUMBER.
When you type 1, 2, 3, 4, 5, 6, 7, 8, 9, or
0, a small window will open in the middle of the
screen and you may complete the message number.
When you press return, I'll jump you directly to
that message.
Osiris SE Technical Reference Manual Page 71
Marking Received
Sphinx! will always ASK you before marking a
message as RECEIVED.
Set Personal Msg Pointers
This does what I refer to as "LOCKING DOWN"
specific messages.
If you select this option, I'll scan ALL the areas
for unread message addressed to you.
When you press the Left or Right arrow keys, or
click on them with your mouse, I'll move to the
NEXT or PRIOR message stored in the LOCK DOWN
queue, instead of the normal next/prior. If the
next message is in a DIFFERENT area, I will
automatically change areas.
If you press HOME, it will take you to the FIRST
message in the LOCK DOWN QUEUE for the CURRENT
message AREA.
If you press END, it will take you to the LAST
message in the LOCK DOWN QUEUE for the CURRENT
message AREA. This allows you to SKIP over some
messages.
If you want to DISENGAGE the message LOCK before
you read the LAST message, press ESC.
Set Unread Msg Pointers
This works EXACTLY like the "Set Personal Msg
Pointers" except it Locks Down on ALL messages
you have NOT read yet, even if they are NOT
addressed to you personally.
Tag Line
Sphinx! will always add an identification line to
any message it saves.
Sphinx EM/vx.xx * xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
----------------------------------------
xxxxxx will contains 'Osiris Compatible Editor' or
may contain text that you have selected to use in
place of the default.
Osiris SE Technical Reference Manual Page 72
I've included a file called Tagline.ctl. This
file contains some 150 odd taglines. You can add
new taglines to it, maximum length of a tagline is
50 characters.
Place Tagline.ctl in the Osiris directory and
if it exists, Sphinx will pull a tagline from
this file each time you enter a message. Once it
has reach the end of the file, it will start over
with the first tagline.
Screen Clip
Sphinx! supports CLIP to File using your mouse if
you're at the main menu, message center or in
a conference area.
CLICK the RIGHT mouse button to trigger the
CLIP function.
Move the mouse cursor to where you want the
CLIP to start and press the LEFT mouse button to
drop the CLIP anchor. Move the mouse cursor to
where you want the CLIP to end, you may not move
to the LEFT of your anchor or above the anchor,
and press the RIGHT mouse button.
As you move your cursor, once the anchor has
been dropped, the area that WOULD be considered
as part of the CLIP rectangle will be
highlighted.
After you have pressed the RIGHT mouse button,
you'll be asked for the name of the file to save
the screen CLIP.
The default is Sphinx!.cut and can be
selected by pressing RETURN or clicking the LEFT
mouse button. If the file already exists, you
will have the option of APPENDING to it or
OVERWRITING it.
Using CLIP is preferred over the " WRITE to TEXT
File " option if you only need PART of the
message.
Osiris SE Technical Reference Manual Page 73
Dc Word(tm)
DC Word(tm) isn't actual an individual program,
it's a module for Message entry in Sphinx!. DC
Word(tm) was designed specifically for message
entry systems found in CBIS, BBS, Mailers,
etc. It has many, if not more, options found in most
popular word processors. DC Word(tm) has a default
left margin of one and a right margin of 75. The
margins may not be changed. When entering test,
I'll automatically wrap when you exceed the 75th
column.
If you press <CR> then you'll move to the next
line, if one is available, and the line you where on
will be flagged as ENDING with a HARD CARRIAGE
RETURN. You should ONLY use <CR> to format columns
of data or to signal paragraph changes. DC Word(tm)
allows up to 161 lines of text, seven pages or
about 13K. There are other systems that cannot
handle messages exceeding 10K. At the bottom of the
screen you'll find a status bar. It shows the
current row, col., page, and the number of lines left,
excluding the current line. There are several
command keys available and pressing ALT-H will
display a help screen listing them.
Commands
Items beginning with (*) designate wordstar
compatibility
(*) Up Arrow Key or ^E - Move up a line.
(*) Dn Arrow Key or ^X - Move down a line (cannot
go pass last line of text).
(*) Left Arrow Key or ^S - Move one CHARACTER to
the left.
(*) Right Arrow Key or ^D - Move one CHARACTER to
the right.
(*) Ctrl - Left Arrow Key or ^A - Move one WORD to
the left.
(*) Ctrl - Right Arrow Key or ^F - Move one WORD to
the right.
(*) HOME or ^Qs - Move to the start of the current
line.
Osiris SE Technical Reference Manual Page 74
(*) END or ^Qd - Move to the end of the current
line.
(*) Ctrl-HOME or ^Qr - Move to the first line,
first column of the message.
(*) Ctrl-END or ^Qc - Move to the Last line, first
column of the message.
Ins - Toggles Insert Mode on/off. Cursor becomes
a BLOCK when in insert Mode.
(*) DEL or ^G - Delete the character under the
cursor, move rest of line back to fill hole.
If you are at the end of the line, I'll look at the
line below your current position and if I can move
text from that line to your current line, I will.
(*) PgUp or ^R - Move up a page or to Top of
document, which every comes first.
(*) PgDn or ^C - Move down a page or to Bottom of
document, which every comes first.
(*) Ctrl-N - Split the line at the current
cursor position.
(*) Ctrl-Y - Delete the current line, move all
text up a line.
(*) Ctrl-I - Tab
(*) BS - Backspace delete.
ESC - Done editing, exit DC Word(tm).
(*) Ctrl-B - Reformat document.
ALT-D - Engage Dictionary.
ALT-J - Jump to DOS.
ALT-I - Import Text file.
ALT-X - Delete from current position to end of
line.
ALT-S - Cursive Signature.
ALT-R - Redraw Screen.
Osiris SE Technical Reference Manual Page 75
(*) ^KB - Start Block Mark.
(*) ^KK - End Block Mark.
(*) ^KC - Copy Marked text to line below current
location.
(*) ^KY - Delete Marked text.
(*) ^KH - Dissolve Block Marks (HIDE).
(*) ^KW - Write Marked text to a file.
I'll highlight marked text in reverse video to
illustrate the first and last line in the block.
(*) ^U - Undelete last line deleted with ^Y,
Delete buffer will hold the last 36 lines of text
deleted with ^Y. Individually deleted characters
will NOT be saved in the undelete buffer.
(*) ^T - Delete word. DC Word(tm) will start at the
current cursor position and delete an entire word.
I'll use either; end of the line, a white space, or
a punctuation mark to determine the end of a word.
If you are at the END of the line to start with,
WORDS that will fit in the remaining space on the
next line will be pulled up to the current line.
^V - Insert Blank line below current position.
ALT - C - Access Cut section of CUT/PASTE. Requires
Mouse.
ALT - P - Access Paste section of CUT/PASTE.
Requires Mouse.
<- Del Key - Moves the cursor back a character and
deletes the character at the new cursor position.
If you're at the start of the line, I'll move you
to the end of the line above you.
Left Mouse Button - Active Mouse Menu. Requires
Mouse.
Right Mouse Button - Active Quick Jump. Requires
Mouse.
All functions will prevent you from going pass
the last available line. Should you attempt it,
the system will BEEP at you.
Osiris SE Technical Reference Manual Page 76
F1 - Access calculator.
F2 - Access TEXT VIEWER.
F1 - Calculator
Most of the functions are fairly straight forward
except 'M' or Memory.
If you press M, the CURRENT total will be placed in
the CUT/PASTE buffer, lets you paste the total into
your message using ALT-P.
To EXIT the calculator, press ESC.
F2 - Text Viewer
This is a windowed text viewer, similar to the one
found in control.exe. The idea is to allow you to
bring up a text file for viewing without having to
exit the word processor.
You may CUT text from the text window and PASTE it
into your messages.
You can make Multiple CUTS and each cut will be
appended onto the last CUT(s). The only restriction
is the total size of the CUTS cannot exceed 4000
bytes, the maximum size of the paste buffer. If you
exceed 4000 bytes, the remaining text will be lost.
Once you have finished viewing or cutting text from
the text window, press ESC to return to work
processing mode. Once you have re-entered this
mode, you can paste the text you CUT using ALT-P.
The TEXT VIEWER window should be able to handle
text files in excess of 350,000 bytes.
Alt-D Dictionary
ALT-D gives you access to the Osage dictionary.
You should have Osage.dic and Osage.idx in the
same directory.
Alt-J Jump To Dos
This uses VMS to free up all available memory.
The current screen and cursor positions will be
saved and restored when you return.
If I can't allocate a buffer to store the video
screen, you'll get an error message and the Jump to
DOS will be aborted.
Osiris SE Technical Reference Manual Page 77
Ctrl-B Reformat
After a heavy editing session, your text could
look choppy. This really doesn't hurt anything,
but it's there if you want to use it.
Alt-I Import File
Allows you to import text files. The only
restrictions placed on this function is the size of
the file. It must fit within the space you've got
left. I'll make sure of that and when you run out
of space, I'll quit importing the text.
Although it's not a restriction, the length of the
lines in the file should be discussed.
I'm allowing only 78 character per line before
either wrapping or requiring a HARD CARRIAGE
return. Should the file contains lines that
will not meet this requirement, I'll force it
by placing HARD CARRIAGE returns in as needed.
This means a file may not look like you though it
would.
If you're importing files that have lines LONGER
than 66 characters, I suggest that you attempt
to shorten them so they'll display correctly.
When you select the IMPORT option, I'll ask you'll
for the file name. You can enter the full drive,
path, and file name. You may use the wild card
characters; '?' and '*'.
I'll scan that directory and show you a list of
files matching the file name pattern you typed in.
Move to the one you want and press return.
When I start importing a file, I'll always check to
see if you're on a BLANK line. If not, I'll start
INSERTING the text following the line you're on.
I'll NEVER over write any existing line of text.
Alt-S, Cursive Signature
Press ALT-S, enter the signature, and it will be
converted to the new FONT format and you may
place it anywhere in the message by pressing the
ALT-P for paste.
Osiris SE Technical Reference Manual Page 78
You can also block mark the signature, after you
display it with ALT-P, and write it to a MACRO
file.
______ _ o
/ / ' ) / '
--/ /_ _ / / / o __.
(_/ / /_</_ (_(_/ <_/ |_
(|
Mouse Menu
Pressing the left mouse button will activate the
mouse menu. This is slower than using the
keyboard commands but does lower the learning curve
for new sysops.
Once the mouse menu is open, move to the option
you want, or the sub-topic, and press the left
mouse button. If it is an option (jump to dos)
then it will be activated.
If it is a sub-topic (BLOCK) a pull down menu
will appear. Move to the selection you want and
press the left mouse button.
The RIGHT mouse button can be used to back up.
Cut/Paste
Cut/Paste requires that you have a mouse.
Both Cut and Paste can be activated using keyboard
commands, ALT-C for CUT and ALT-P for Paste, or the
mouse menu.
Cut
Allows you to mark text on the screen and places it
in a buffer. Cut does NOT remove or delete the
marked text. It cuts out a section of the
screen and store it for PASTE recall.
If you select this option, your mouse cursor will
be placed in the middle of the screen. Move to the
upper right hand corner of the section you want to
cut and press the LEFT mouse button. This will drop
the first anchor.
Once you have dropped the first anchor, you may not
go pass it, horizontally or vertically.
Osiris SE Technical Reference Manual Page 79
As you move, the text will be highlighted. Once
you have selected all that you wanted to CUT,
press the RIGHT mouse button.
You can CUT as little as one character or the
entire screen. If you cut multiple screen lines,
then each line will end with a hard carriage
return. The text will remain in the cut buffer
until you select to CUT more text.
Paste
Paste may be selected from the mouse menu or by
pressing ALT-P.
If you have CUT text, selecting the PASTE option
will begin placing the text in your message at
your current location. If you are NOT in insert
mode and you aren't at the end of the message
then the text that's already there will be
over written.
You can paste CUT text as many times as you like.
The same text will be available until you CUT
more.
Quick Jump
You can active the Quick Jump by pressing the
RIGHT mouse button. This allows you to QUICKLY
jump to different spots in your message, limited
to locations on the CURRENT screen.
When you press the RIGHT mouse button, the mouse
cursor will be placed in the middle of the
screen. Move to the location you want to jump to
and press the LEFT mouse button.
You can't move pass the last line of text or the
last column on a particular line. Attempts to move
pass the LAST line of text will place you ON the
last line. Attempts to move pass the last column
on a particular line will place you at the LAST
column position for that line.
Macro Keys
You have 9 scrap MACRO keys that can be programmed
to do all most anything you can do manually.
Each MACRO can be triggered by pressing ALT-1 -
ALT-9.
Osiris SE Technical Reference Manual Page 80
Providing the MACRO file for that key exists, it
will be executed.
Each MACRO has its own specific command file,
MACx with x being the MACRO key in question.
i.e. MACRO ALT-1 uses the file name MAC1
To create a MACRO file, use any text editor and
enter what you want. Normal text, not DC Word(tm)
commands, will simply be imported into your
message as TEXT.
All DC Word(tm) normal key functions, Ctrl-I type
keys, can be triggered by entering them in
character format. In other words, use some type
of program, like Char.exe, to generate the
character representation of the ASCII value for
the command.
Certain DC Word(tm) commands do not use ASCII
characters but use IBM Extended Keyboard Scan
codes.
e.g. The Left, Right, Up, and Down Arrow keys.
Using these commands requires a TWO character
sequence. You must prefix each command with ASCII
character 238. Following the ASCII 238, enter the
character representation for the key.
Osiris SE Technical Reference Manual Page 81
Below is a chart listing each command and its
ASCII value, keeping in mind that you don't enter
the ASCII value but the ASCII character for that
value.
01 - Pause for 1 second
02 - Wait for a key press
32 - Active Dictionary
45 - ALT-X, Clear to EOL
19 - ALT-R, Redraw Screen
35 - ALT-H, Show Help
36 - ALT-J, Jump to DOS
23 - ALT-I, Import Text File
82 - Toggle Insert on/off
83 - DEL, Black hole delete
77 - Right Arrow key, move right one character.
75 - Left Arrow Key, move left one character.
115 - Ctrl-Left Arrow Key, move left a word.
116 - Ctrl-Right Arrow Key, move right a word.
73 - PgUp
81 - PgDn
119 - Top of Document
117 - End of Document
72 - Up Arrow
80 - Dn Arrow
79 - Goto End of Line
71 - Goto Start of Line
There's no limit to the size of the MACRO file.
Since there's no size restriction on a MACRO, there
is NO need to allow MACRO chaining.
NOTE: Although you may activate the dictionary and
the import file functions, you may not supply
file names nor dictionary input. The MACRO will
continue to execute when the function has
completed its task.
Color
You can change or set the primary screen colors in
Sphinx with the program SColor.exe. Move Scolor.exe to
the directory that contains the display.dat file.
Run scolor, no command line arguments required, and
follow the instructions on the screen.
Osiris SE Technical Reference Manual Page 82
File Subsystem
The HELP file for the File Menu, FILEHELP.(ASC/MMU/ANS), must
be in the Osiris text support directory.
Upload/Download File(s)
I'll allow you download a file from any file area ,
providing you have access, even if that file is NOT in
the current area.
To do this with a reasonable degree of speed, I use a
special secondary indexing system that will catalog
all the files on your system, upload and download
directories. I will use the individual PRIMARY file
listings in each area to build the secondary index.
Files.idx
Files.idx contains the name(s) of the files
along with a pointer to a record in files.dat.
Files.dat
Files.dat contains all the information about the
file that would normally be found in its
files.qbs.
Dl_area.idx
Dl_area.idx contains pointers to the START of each
Download directory in the files.dat file.
When you UPLOAD a new file, I'll automatically update the
secondary indices. Right now this serves no other purpose
than to prevent duplicate uploads that may come along before
you move the file to a download directory.
New uploads will NOT be available for
downloading UNTIL you move them to a download area
via FAM.
When you adopt orphans, delete, or move files via FAM
you'll need to REINDEX or the pointers will be off and
the files cannot be downloaded. FAM "SHOULD"
automatically call Cat when you perform any operation
that may affect the download status of any file.
You may SPECIFICALLY request cat to
reindex the file areas by using the
command line CAT B . The other
functions of CAT will be bypassed
by this request.
Osiris SE Technical Reference Manual Page 83
The NEW upload search and SEARCH function use the
secondary indexing system to speed up operations and to
decrease the pounding your hard drive takes.
Wildcard Characters
Unlike WildCAT! and Pcboard, which also allows
downloading from any directory, I'll allow wildcard
characters in file names and allow you to restrict the
search to the current area or system wide.
Advantages
A) The number of files that you can download during a
single batch transfer is 40.
B) The files can be in any combination of file areas.
C) File verifications, for downloading, is very fast.
D) File duplicate checking, uploading, is very fast.
E) Checking a CD-ROM drive for duplicates,
searching, and new uploads is not a problem.
F) Because of the reduction in head movement, your hard
drive will last a lot longer.
Disadvantage
There is one, the additional disk space required for
the secondary indexing system, roughly 167 bytes
per file. This is offset, as least I believe it is, by
reduced head movement.
File Queue
The names of ALL download file(s) will be held in a
file queue. The method of selecting the files, Tag
or download, doesn't matter.
Each listing contains the file name, area, complete
download path, IF the file should be counted in the
user's record, and the file size.
Since I have stored the file(s) in a QUEUE, a
failed download can be restarted without having to
RESELECT the files.
Defining A File Area
You must define each file area, use OSM, before it can be
accessed from Osiris.
Osiris SE Technical Reference Manual Page 84
Select the FILE option from OSM and then select the Edit sub-
option. Move to the last file area you've defined and press
the C)lone key and then press END, located on your keypad.
This will move you to the NEWLY created board. Press E to
edit the record.
Area Name
Area Name is the text name you want displayed to the
caller. I don't use this name for anything, it's
strictly for human consumption.
Access Level
The access level, 1 - 32722, required to get into the
area. If you don't have access, the area will not be
displayed.
Area Access Flags
Area Access Flags allows you to sub-divide an access
level by requiring specific flags to be on or off.
Download Path
The full drive and path to the actual downloadable
FILES.
e.g. c:\general\
This should point the drive and directory that contains
the physical files for this area.
I do NOT validate directories. If the directory does NOT
exist, strange things can happen.
Download Files.qbs
The full drive and path to the FILES.QBS type listing
that contains the list of files that can be downloaded
from the area.
e.g. c:\general\
If the path defined in the Download Path and the one
defined in the Download Files.qbs isn't the same, I'll
assume the area's on a NON-WRITEABLE drive.
Osiris SE Technical Reference Manual Page 85
Cd-Rom Or Worm Drives
The last TWO definitions are very important if you
are defining a file area that's located on a CD-
ROM or WORM Drive. You MUST make a subdirectory on
your MFM/RLL/ESDI hard drive for the "Download
files.qbs." I'll attempt to write to the files.qbs
file in that sub-directory following uploads or
downloads and that requires a writeable drive. Your
"Download path" should point to the directory on
the CD-ROM or WORM drive.
File Not Found, But It Exists!
If you get a "FILE NOT FOUND" message when you
enter a file name, no wild card characters, but you
KNOW that file is in the current area then you need
to do two things.
To eliminate the possibility that FAM messed up or
that the index itself has been damaged, run CAT B
and try again.
If that does not fix the problem then you have
duplicate download areas, i.e., the same physical
sub-directory and the same files.qbs for more than
one file area.
You CAN have multiple file areas using the same
physical sub-directory, but each file area MUST
have a unique files.qbs structure.
Upload Path
The full drive and path pointing to a temporary storage
area for files uploaded to this area.
The upload path should NOT be the same as the "Download
Path."
The Help Menu
"The Help Menu" is the name of the FULL Help menu for
the area.
You should NOT list the extension and the file must be
in the text support directory.
You can use one menu for ALL areas, different menus for
each area, or any combination you chose.
Osiris SE Technical Reference Manual Page 86
Dnl Files Name
The name of the file that will hold the listings for all
the files in the area, the default being FILES. You
should NOT list the extension and I'll add .QBS to it.
This allows you to combine different areas in the same
physical sub-directory and logically divide them with
different "DNL Files Name."
Although this is allowed, I would discourage it because
of the limited number of files that FAM can handle, 750
files per area, and because DOS will drastically slow
down in proportion to the number of files.
Upl Files Name
The name of the file that will hold the listings for all
NEW uploads for the area, the default being FILES. You
should NOT list the extension, I'll add .QBS.
You can, in fact it is desirable, use the same upload
directory and the same "UPL Files Name" for all areas.
Callers seldom upload in the correct directory and you
will usually have to MOVE the file anyway. This makes it
easier to work with if ALL uploads are grouped.
Free Download Area
This means downloads from this area do not get recorded
in the users record. They just didn't happen as far as
ratios and download limits are concerned.
Application Flags
These flags can be used by just about any program that
needs YES/NO or ON/OFF switches to indicate whether or
not it should do whatever it is the program does to a
specific file area. Read the documentation for the
application you're going to use, it will tell you if it
requires a flag or not.
So far only one external application uses the
application flags, CAT.EXE.
The application flag field works just like the other
flag fields in Osiris.
In OSM the flag field is represented by a string of 0's
and 1's. 0 (zero) indicates the flag is off and 1 (one)
indicates the flag is on.
Osiris SE Technical Reference Manual Page 87
Flags are numbered 1 to 16 from left to right.
E.g.
0000000000000000
1234567891111111
0123456
Command Key Options
The remainder of the file board definition record
pertains to selecting command keys, access levels, and
command key flags.
Commands you do not want to use, set the access level to
32001 and use a space as the command key.
Area Change
A list of available file areas, those you have
access to, will be displayed. You can enter the
number of the area you want or press <Enter> to
abort the area change.
Another way of changing areas, once you know the
system, is to ENTER the area number on the command
line and press RETURN.
e.g.
xxx minutes Remaining Command ? 12 <ENTER>
You'll jump DIRECTLY to file area 12.
Alternate Area Listing
Given the maximum length of an area name, I
can only display the list of available areas
in a two columns format.
If you would rather custom design your own
display, create a file called
"FDISPLAY.MMU/ASC/ANS" and place it in the
TEXT support directory.
If this file exits, I'll display it rather
than the dual column listing.
Keep in mind that this is a simple text file
and I can not control area displays by access
level. If you want that, you'll have to use
SPL/I and control the display yourself.
Osiris SE Technical Reference Manual Page 88
Log Off
A graceful way to hang up with the option of
leaving a message, to the sysop. Logging off using
the log off command is not required and dropping
carrier will not harm anything.
File Search
Lets you enter a search string, NO wild cards. The
system will display the area and file name of
matching files.
I will display a file called "Search.asc/mmu/ans."
It should contain instructions on what is
acceptable. A default search.mmu file is included.
The search will allow you to TAG any MATCHING files
for Batch Downloading.
The search does NOT stop with the first matching
file, but it'll continue to search ALL available
areas.
You can abort the search by pressing Ctrl-K or by
selecting Q when a match is found.
Kill
Permits you to kill a file. Be careful of
this command. Do not give callers access to it
unless you know and trust them. (Knowing where
their children go to school helps too!)
I don't allow wild card characters to be used
in the kill file name. Only you are allowed to
kill more than 2 files per call. After the two-
file limit, the caller is NOT allowed to kill
any more files.
Main Menu
Takes you back to the Main Menu.
If you used an SPL/I command to enter the file
area, takes you BACK to the SPL/I command file
instead of the main menu.
Quick File List
Displays only the names of the files in that area
along with their file size and description.
Osiris SE Technical Reference Manual Page 89
Full File List
Displays the files available for downloading in
the current File Area along with file dates,
descriptions, times downloaded, transfer time, who
downloaded it last, when it was last download, who
uploaded it, and file sizes.
List In Reverse Order
Both the QUICK file list and FULL file list
will allow you to LIST the files in REVERSE
Order.
*IF* you have FULL help turned on OR have
elected to use HOTKEYS, I'll ask if you'd like
the list in reverse order. The default is N)o.
Once you have turned HELP down a level, the
prompt is skipped, but may still be used via
COMMAND stacking.
e.g. L -
List Mask
Both the QUICK file list and the FULL file
list commands also allow a LIST mask. You can
enter part of the file name and ONLY those
files matching will be shown. This is a SLIDE
type match and NO wildcard characters, * or ?,
are allowed.
Like the reverse order option, if you have
FULL help turned on or you're using HOTKEYS, I
will ask for a mask or RETURN for ALL files.
Once the Help Level has been turned DOWN a
notch or two, the prompt will disappear but
can still be used via command stacking.
e.g. L BA
List only files starting with 'BA'
e.g. L - BA
List files in REVERSE order and then ONLY
those files starting with 'BA'
Osiris SE Technical Reference Manual Page 90
Upload
Lets you send a file to the system. When you
select upload, I'll check the free space on the
hard drive where the uploaded file will be
placed. If there is less than one Mbyte of free
space, I'll not allow the upload. You'll be told
why I could not allow the upload and an error
message will be placed in the BBS log file.
The first question I'll ask is "FOR SYSOP EYES ONLY
?". If you indicate that it is, a forward slash '/'
will be appended to the START of the description
field.
If you answer NO AND have the access, I'll ask if
the file is to be password protected.
If you have ACCESS you can also PASSWORD KILL a
file. Meaning it is password protected and I've
been instructed to DELETE the file after its been
downloaded.
You can't intermix FOR SYSOP EYES ONLY and PASSWORD
protected files.
I'll ask you, following the description field
prompt, if you would like to post a message to go
along with the file. You can post a message in any
area providing the following conditions are met:
1. You have the area selected.
2. You have access to the "enter message" command
for that area.
I do FOUR primary tests to ensure the upload file
name is a valid DOS file name.
1. Entire file name is tested to see if it falls
within the twelve character DOS limit.
2. The file extension, if one is used, is tested to
make sure it doesn't exceed the three character
DOS limit.
3. A test is run to ensure that only ONE period
exists in the file name. ie. Dos.zip is valid,
Dos.zip.zip is not valid.
4. If no file extension is used, test one is rerun
with an eight character limit.
Osiris SE Technical Reference Manual Page 91
File Duplication System
You MUST tell me what file(s) you are planing
to upload before uploading, even when using
a batch protocol. This allows the File
Duplication system to systematically search
all upload and download areas, using the Btree
indexing system. Should a match occur, the
file will not be allowed.
You do have the option of specifying the TYPE
of search. In your NODEx.INI, you'll find a
option labeled DUPLICATE SEARCH TYPE.
Osiris currently supports two types, TYPE 0
and TYPE 1.
Type 0 search means an EXACT match. If the
file name is "BRAND.ZIP," then you'll have to
already have BRAND.ZIP on the system.
Type 1 search means to find the first file
name, if it exists, equal to or greater than
the upload file name, minus the extension.
If the upload file name is BRAND.ZIP, then
I'll look for anything that will match BRAND.
E.g., Brand.arj, Brand.lzh, etc. would match.
Badfiles.bbs
You may want to set up a control file,
badfiles.bbs, that can be used to FILTER out
certain files.
Badfiles.bbs is a text file that contains one
file name per line. You should place
Badfiles.bbs in the Osiris= directory.
I don't place a LIMIT on the number of files
you can list in Badfiles.bbs. But, the time it
takes me to check the upload name against the
contents of Badfiles.bbs will increase
proportionately to the number of file names
you've listed.
Lotus.arj
Dbaseiv.zip
If the above lines were in the Badfiles.bbs, I
would prevent anyone from using those file
names during an upload.
Osiris SE Technical Reference Manual Page 92
(G)oodbye After Batch, (A)bort, Or (S)tart Transfer ?
Gives you the option of aborting or if it is a
large transfer, to automatically disconnect
after the file transfer.
If you select the auto-disconnect, I'll give you
10 seconds to abort the disconnect before
severing the connection. This works not only on
uploads, but also on downloads.
Archive Integrity Check
Following the upload, I'll verify the archive
by extracting the contents to a work
directory.
Virus Check
If the file passed the archive integrity check
and you have virus checking activated, I'll
call SCAN.EXE to scan the files for over 300
known virus infections. If a virus is
detected, I'll notify you, the caller, and
then delete the infected upload.
Scan.exe MUST be in a PATHED directory. If it
is not, you will lose uploads. DOS will return
the error code used by SCAN if it cannot find
SCAN.EXE.
Providing everything was OK, I'll display a brief 2
line message showing the number of files you've
uploaded along with the number of Kilo-Bytes.
If the protocol was one of mine, the AVERAGE, in
case of batch transfers, throughput will also be
shown.
I'll also post a message, in the message center,
thanking you for the upload(s). Each file uploaded
will be listed in the message.
If the file transfer did NOT go, you will have the
option of RETRYING without having to RE-ENTER any
of the file upload information.
Osiris SE Technical Reference Manual Page 93
Download
Lets you receive file(s) from the system.
All Dos wild card characters, * and ?, will be
supported and expanded to match files in your file
list.
File Ratio Limits
When you set the limits for each access
level, you will supply a File Ratio for
that level. This ratio works off the number
of files downloaded versus the number of
files uploaded. An 8 to 1 ratio means the
caller is allowed 8 files downloaded for
every 1 file uploaded, while 10 to 1 means
10 files downloaded for every 1 up loaded.
The ratio also sees a 0 as a 1, so new
callers will be allowed to download. Since a
zero is the same as a 1, once a new caller
has reached his file ratio limit, he will
have to upload two files to clear it.
When a caller has exceeded his file ratio,
I'll not allow him to download any more files
until he has corrected the problem. The
caller can do that by uploading a file. If
the caller attempts to download and he HAS
exceeded his Ratio limit, the text file
"RATIO.ASC/MMU/ANS" will be shown.
To disable the file ratio warning system
for any access level, just define the ratio
as 0 (Zero).
Kilo-Byte Ratio Limits
When you set the limits for each access
level, you will supply a Kilo-Byte Ratio for
that level. This ratio works off the number
of files downloaded versus the number of
files uploaded. An 8 to 1 ratio means the
caller is allowed 8 Kilo-bytes downloaded
for every 1 Kilo-Byte uploaded.
When a caller has exceeded his K-Byte ratio,
I'll not allow him to download any more files
until he has corrected the problem. The
caller can do that by uploading a file. If
the caller attempts to download and he HAS
exceeded his Kilo-Byte Ratio limit, the
text file "BYTE.ASC/MMU/ANS" will be shown.
Osiris SE Technical Reference Manual Page 94
To disable the Kilo-Byte ratio system for
any access level, just define the ratio as 0
(Zero).
Password Protected Downloads
The unique aspect here is that the AREA itself
is not password protected. The actual file
itself can be password protected.
If a caller attempts to download a password
protected file, he MUST supply the password
associated with that file.
The archive functions of extract and contents
will not work on any protected file.
Password Kill After Downloading
This functions the same as the Password
download EXCEPT, the file will be deleted and
the file listing for it removed once the
caller has download it.
Bi-Directional Upload
Following each download, I'll check the
temporary upload directory, UPLxx.TMP with xx
being the node number, to see if the party
doing the download uploaded anything using a
bi-directional protocol.
File Queue
The new upload search, search/find, full file
listings, and quick file listing has a TAG
option. You can tag up to 40 files, in any
directory, for batch downloading.
The File Queue system has its own internal menu(s)
and you don't need to setup anything.
The File Queue menu has several selections:
Download, list selected files, remove a file(s),
clear the queue, estimated transfer time, return to
file menu.
Osiris SE Technical Reference Manual Page 95
Download
Similar to the Download command from the main
file area. Providing you have access, time,
and you haven't exceeded any of the file
ratios, I'll allow you to download the tagged
files from the QUEUE menu.
List Selected Files
This will display a LIST of the files you've
tagged along with the TOTAL byte count.
Remove
If you've selected too many files and don't
have the time or byte count to download them,
you can remove individual files from the
queue.
Estimated Transfer Time
Shows the estimated transfer time for the
files you have tagged.
Leaving the file area, downloading other files,
etc. does not affect the status of the tagged files.
Trans Stats
This displays information about your current file
transfer statistics: Last throughput rating, number
of bytes and files downloaded for the day and total
files and bytes downloaded to date. File Ratio set
for callers access level and his current STANDING
in respects to those ratios.
Messages
Gives you direct access to the Message Center from
any file area.
Type
Displays an ASCII text file listed in the
FILES.QBS to the caller's screen.
For security purposes, ANSI characters and SPL/I
commands will be FILTERED out of the file.
Protocol
Lets you reset your default protocol from the file
area.
Osiris SE Technical Reference Manual Page 96
Extract
Lets you pull a single file OUT of an Archive for
downloading. The first name I'll ask you for is
the FULL name of the Archive, the extension
must be included. The second name I'll ask you
for is the name of the file to be EXTRACTED
from the archive.
Restrictions
No wild card file names, those to be
extracted, are allowed; the primary file
must be an Archive; and only ONE extracted
file is allowed at one time.
Auto-Cleanup
I'll automatically clean up after an
Extraction either when you log-off or when
carrier is lost. Any extracted file or
Osiris-built extracted archive left lying
around will be deleted before control is
released back to the front-end.
Rearchive
Once the file has been extracted, I'll ask
you to select a NEW archive format for the
file.
Archive formats supported: ARJ, ARC, ZIP, PAK,
and LZH.
If I can convert the file to the requested
format, it'll be placed in the file queue for
downloading.
All Extracted file(s) will be placed in a sub-
directory called TARC, located off the Osiris=
directory. I'll create the directory if it
does NOT exist.
This allows Extract to be used on WORM or CD-
ROM drives.
Contents
Displays a list of all the files contained within
an archive. The name I'll ask you for is the
FULL name of the archive and the archive
extension must be included. View supports ARJ,
PAK, ZIP, LHARC, and ARC.
Osiris SE Technical Reference Manual Page 97
Achiever Notes
Osiris requires the following archive programs
for extract and view.
PAK.EXE
ARJ.EXE
PKUNZIP.EXE
PKZIP.EXE
LHARC.EXE
PKXARC.EXE
PKARC.EXE
You should set the shell memory for archivers
to 384K, the largest amount of free memory
required by ARJ.
New Files
The new upload search is based on the DATE of your
LAST new uploads search, new callers will default
to the CURRENT date.
The last search date will be displayed and you do
have the option of changing it. At the end of the
search, I'll ask you if it is OK to log the date of
this search, provided it isn't already set to the
current date.
This lets you forego having the date logged if you
do not, for whatever reason, have time to download
the new files. You can say "No" and the next time
you do a new uploads search, the same date will be
used.
You also have the option of TAGGING any NEW file,
adding it to the file queue, for batch downloading.
Password protected files will not be listed in this
search.
Conference
Takes you to the Message conference subsystem.
Gate_fr
A text file (Gate_f.asc/mmu/ans).
Osiris SE Technical Reference Manual Page 98
File One
A text file, File1.asc/mmu/ans, provided for any
thing you want to use it for.
Before you attempt to access any newly defined file
boards, you should bring up FAM and log into each
of the new areas to make sure you did not miss
define a path.
Dl Time
When you TAG or enter the name of a file to download,
the estimated download time will be displayed following
the file name.
This is based on TOTAL BYTES SELECTED. In other words,
if 4 files have already been selected and you enter a
5th file name, the estimated transfer time will be for
ALL FIVE FILES.
Error Messages
When you type in the name of a file to download,
there are four possible error messages.
=> FILE NOT FOUND <= which means you typed in the
name of a file that doesn't exist on the system.
=> ACCESS DENIED <= The file was located in an area
that required a higher access level.
=> PWD FAILURE! <= which means you attempted to
download a password protected file and failed to
enter the correct password.
=> Duplicate <= which means you've selected a
file you ALREADY HAVE listed for downloading.
File Transfer Protocols
Protocols, Internal Or External
You have two basic ways of handling protocols, you can
build them into the BBS package or you can use EXTERNAL
protocols. Each method has its own advantages and
disadvantages.
Internal
Internal protocols give you, or rather me, total
control over what is actual SENT and what is
actually RECEIVED.
Osiris SE Technical Reference Manual Page 99
If you select 5 files to download, but lose carrier
after transferring only 3 of them, then I know only
the first 3 got transfers and will only "BILL" you
for those three files.
If you upload a file, I know EXACTLY what file you
uploaded and I can wait until AFTER you finish to
get the descriptions.
Internal protocols do have several major, I think
they are major, drawbacks.
The specific way a protocol works, internal code,
isn't always compatible with the MACHINE it's being
used on. A good example is DSZ. It works fine on
some computers, but not on others.
If the internal protocol doesn't work on your
machine, you're out of luck! If there is a BUG in a
particular protocol, you have to get a WHOLE NEW
BBS package when the bug is fixed. If you don't
like the way the protocol LOOKS or functions,
you're out of luck!
External
With external protocols, if you don't like the way
a specific protocol looks or works, you're free to
swap in one that does work or looks better. It's
ENTIRELY up to you.
If a protocol has a BUG, you ONLY need to get the
new PROTOCOL driver and NOT the whole BBS package.
Most of the GOOD protocols, Tmodem for instances,
are proprietary and you HAVE to go with an external
driver if you want to USE them.
External protocols DO have a couple of drawbacks.
If you're downloading a BATCH of files and you get
3 of them but lose carrier on the 4th and final
file, I'll have to "BILL" you for ALL 4 files.
Question: Why?
Answer: DOS only allows you to EXIT a program with
a SINGLE error level. External protocols use error
level 0 to indicate a successful transfer and 1 or
higher to indicate an unsuccessful transfer. You
can't say 0 for this file and 1 for this file.
Osiris SE Technical Reference Manual Page 100
Question: Why not a LOG file indicating which
file(s) were sent?
Answer: You could, providing the protocol driver
could write the LOG in a SPECIFIC format AND the
protocol driver would also have to be MULTIUSER.
You can't have a protocol driver on two or three
different NODES attempting to WRITE to the same
LOG. You'll end up with garbage. And if you start
REQUIRING external protocols to FUNCTION in a
specific MANNER, you will have a lot of trouble
finding ones that will work with your software.
Pcboard is a GOOD example. If you use MY
protocols, I will use that type of log but it is
not required.
When you UPLOAD, I have to ASK you, before the
upload, what file(s) you'll be uploading.
If you tell me you'll be uploading "TEST.ARJ" and
turn around and upload "TEST.ZIP," you'll NOT get
credit for the upload because TEST.ARJ does NOT
exist in the upload directory.
Again, the protocol can ONLY exit with ONE error
level AND you can't use a LOG file for the same
reasons you can't use one on DOWNLOADS.
If you are using one of my protocols; Tmodem,
Zmodem, Ymodem Batch, Ymodem-G, or Zmax and you
engage the -N switch, the protocol driver will
simply refuse to accept anything you didn't tell
the BBS you were going to upload.
Question: WHY couldn't I JUST look in the upload
directory and if there is a NEW, use the name of
THAT file.
Answer: Because I don't KNOW that you were the one
that uploaded that file. What if someone on Node 3
was uploading and that file was one of his?
Question: Why not use a different upload holding
area for each node?
Answer: You could with a 2 or 3 node system, but
anything more than 3 nodes would create a bottle
neck on the file server, copying files back and
forth. A couple of BBS packages do this and you can
really tell it when the system comes to a
screeching halt while the server attempts to catch
up.
Osiris SE Technical Reference Manual Page 101
Osiris is setup to use a control file called "protocol.cfg"
to define the protocol names, programs to use, and the
command line to send and receive files. A functional
Protocol.cfg is included mapped to use my protocol drivers.
This allows you, providing you have a suitable protocol
driver, to add up to 32722 protocols to Osiris.
You use the PROTOCOL section of OSM to define each
protocol and the information for that protocol.
How It All Works
Osiris uses the protocol.cfg file by assigning a number
to each protocol. The position in the file is the
protocols number.
For instances, if the first protocol defined is Zmodem
and it is in the default protocol.cfg file, then
Zmodem would be referenced as protocol number one (1).
I'll take care of formatting a display screen listing
your available protocols along with the CPS for each
protocol.
Protocol.cfg Fields
Each protocol record has seven main fields.
Name
Contain the name of the protocol, the name that will
be shown to callers.
Program
This field contains the name of the actual protocol
driver.
Send File(s)
This field should contain the entire command line
need to send a file or group of files.
You may use the special embedded protocol
characters defined later on.
Receive File(s)
This field should contain the entire command line
need to receive a file or group of files.
You may use the special embedded protocol
characters defined later on.
Osiris SE Technical Reference Manual Page 102
Slow Speed Cps And High Speed Cps
I'll use these fields for figuring transfer times.
The reason you need two fields instead of one :
Some protocols such as xmodem, ymodem, puma, etc.
function "reasonable" well at 2400 bps. By
reasonable I mean better than 75 percent. But at
9600+ it's a different story.
As a starting guide here are a few that you can
use:
Protocol Low CPS High CPS
Tmodem 240 1152
Ymodem-G 230 1100
Zmodem 228 1008
Ymodem/Batch 218 624
Xmodem 1K 218 624
Xmodem 204 480
This can and will vary depending on equipment,
protocol implementations, phone lines, etc.
The high CPS is based on a 19.2K lock using an HST
450. A v32bis, 14.4, or DS will provide better CPS
on the high side.
Batch Protocol
This field, set to Y or N, tells me whether or not
the protocol can handle BATCH downloads. The
primary use or goal is to prevent someone from
attempting to download 3 or 4 files using a
protocol that does NOT support that type of
transfer, xmodem. This is to KEEP you from being
CHARGE with ALL of the files, even thou only ONE
was actual sent.
Access Level
This is the access level you have to have to USE
this protocol. This is to accent the ANTI-PMS
system. If you don't have access to a specific
protocol, I'm not going to bother to HIDE it.
New Callers
You should have your BASIC protocols set to
access level 0 so NEW callers can select them.
Since new callers don't yet HAVE a user
record, their access level would be ZERO.
Osiris SE Technical Reference Manual Page 103
Embedded Protocol Characters
You will need a method of passing the com port, baud
rate, and the name(s) of the file(s) to be sent or
received.
Therefore, 6 special two character sequences have
been reserved.
*L = Locked Serial Rate
*B = Baud Rate
*P = Com Port
*F = File name(s) (MUST BE LAST ITEM LISTED)
*U = Use File SEND control file (MUST BE LAST ITEM
LISTED)
*P, replaced with the SERIAL port number, 1 - 8.
*T, place full drive and path to the temporary upload
directory for this node.
*B I'll place the CONNECT speed, which will ALWAYS be a
LEGAL serial rate.
Some BBS programs, Wildcat and Pcboard for example, will
send almost anything as a connect baud rate, including
12000 and 14400. That causes external programs to have
fits because 12000 or 14400 are not legal serial rates.
*F means place the file names to SEND or RECEIVE here.
The NUMBER of files that can be sent will depend on the
LENGTH of your file download paths. Only what will fit
on the 128 character command line (including all other
items such as baud rate, port number, etc.) will be
allowed. The rest will be ignored. This MUST be the very
last switch you use.
If you're testing your installation and notice that
after you've selected several files and you go to
DOWNLOAD and the number shown is LESS than what you've
selected, don't get alarmed and start looking for the
"BUG."
This isn't a bug and I'm just "TRIMMING" the number of
files BACK to what will FIT on the command line.
Osiris SE Technical Reference Manual Page 104
Silly, but I spent 4 hours one day trying to FIND that
THINKING it was a bug. It finally dawned on me, there
was NO bug and I had used the *F in place of the *U.
*U means place the names, including drive/path, of the
files to send in a control file and pass the name of the
control file to the protocol driver. I'll generate the
name of the control file and it'll be called SENDxx.CTL
with xx being the NODE number the caller is on.
The control file will be placed in the Osiris system
directory and the full drive, path, and name WILL be
passed to the driver.
e.g. Assuming you are using my drivers then
-@*U
would translate to -@C:\OSIRIS\SEND1.CTL
Providing C:\OSIRIS was the Osiris system directory and
the caller was on NODE 1.
You MUST use the *U approach if you're going to allow
your callers to take full advantage of the file queue
system. Otherwise they'll be restricted to downloading
only 2 or maybe 3 files at a time.
*L - SERIAL LOCK RATE and is primarily for protocol
drivers I didn't write but need to have the serial lock
rate passed to them.
Bi-Directional Protocols
Osiris does have internal support for bi-directional or
full duplex protocols such as Bimodem and HS/Link.
To set-up a protocol as bi-directional, simply include
the *T switch with the appropriate protocol command line
argument that indicates where the upload directory is
located.
E.g., HS/Link would use -U*T
If node 1, Osiris would replace that with
-UC:\OSIRIS\UPL1.TMP
When the caller selects the files he wants to download,
he may have HS/Link or Bimodem send the files he wants
to upload.
Osiris SE Technical Reference Manual Page 105
After the download, I'll check the temporary upload
directory for anything he or she may have uploaded
during the download.
If I find any files the following will happen:
1. I'll check to see if the file already exists on the
system. If it does, the file will be deleted and the
caller will not get credit for the upload.
2. If the file is has the file extension of EXE, COM, or
BAT it will be deleted and the caller will not get
credit for the upload.
3. Assuming the file passes 1 and 2, it will be moved to
the upload area for the current file area.
4. If the file is an archive and you have virus checking
turned on, the file will be pulled apart and virus
checked.
5. Assuming it is free of any type of virus, the caller
will be asked to enter the files description. If the
caller drops carrier before the file description is
entered, the file will be deleted and he will not get
credit for the upload.
Bi-directional transfers CAN be an asset if you have
callers willing to upload files and they are using 2400
baud modems.
Restrictions
Be forewarned, bi-directional transfers are VERY
CPU intensive. Your computer may be able to handle
bi-directional transfers at 2400 baud but it may
not be able to handle them under v32, v32bis, or
v32fast connects.
Bi-directional transfers at speeds higher than 2400
baud RARELY work under Windows, Desqview, or when
Network software is in memory.
Bi-directional transfers at speeds higher than 2400
baud generally requires a 16550 highspeed uart.
Bi-directional transfers will not work with
USRobotics 14.4, Hayes 9600v series, TeleBit PEP,
CompuCom CSP, and several other highspeed
protocols.
Osiris SE Technical Reference Manual Page 106
Validation And Virus Checking
You nodeXX.ini has an option to turn on virus checking. If
this is ON, I'll do several things to a new upload.
1. The uploading of EXE or COM files, often used to spread
virus infections, will not be allowed.
2. Following the upload, I'll test the integrity of the
archive by attempting to extract all the files. Should this
FAIL, the file will be deleted.
3. Once step two has been completed successfully, I'll call
SCAN.EXE to scan the extracted files for any virus.
SCAN.EXE MUST be in a PATHED directory or ALL uploads will be
deleted even thou they could not be checked. DOS returns the
same error code for "Program not found" as SCAN does when it
finds a virus.
4. Following the VIRUS scan, the extracted files will be
deleted.
*IF* a virus was detected I'll notify you, the caller and
then delete the infected archive.
Files.qbs
FILES.QBS offers more flexibility than Fido/Opus FILES.BBS
text files. The FILES.QBS file contains:
The file name.
A field for description (80 characters).
The upload date which is used by the new upload
functions.
The name of the person that up-loaded the file.
The number of times that file has been downloaded.
The last date the file was downloaded.
When you select the FULL file listing option, the files
list will be displayed using five lines per file.
Name: xxxxxxxxxxxx File Date xx xxx xxx Upload Date xx xxx xx
Size: xxxxxxxxxx Dwnld Time xx:xx Last Dwnld xx xxx xx
From: xxxxxxxxxx Times Dwnld xxx
Area: XXXXXXXXXXX
Description.
Osiris SE Technical Reference Manual Page 107
Confiles
This is the FILES.BBS to FILES.QBS Conversion Utility.
When you are converting to an Osiris CBIS system from
Fido or Opus, you will want to run CONFILES on each
of your old FILES.BBS files to convert them into
Osiris formatted FILES.QBS files. You may then delete
the old FILES.BBS files at your leisure, they'll
never be used again.
Fam: File Area Manager
FAM will, by default, go to file area #1 and to the
Download Directory for that area. The maximum number
of files it can handle in any file area is 750. There
is NO error trapping on this limit so do NOT exceed it.
I've designed FAM more for a MOUSE than anything else,
but if you don't HAVE a mouse, I'll emulate one for you.
You can use your ARROW keys to move the mouse cursor and
the SPACE bar to simulate pressing the left mouse
button. This is in respects to TAGGING and UNTAGGING
files. With other functions, you'll have to use the
HOTKEYS.
To select a function from the menu, move the mouse
cursor to the one you want and click the LEFT mouse
button.
You can also PRESS the HIGHLIGHTED letter(s) displayed
on the menu.
To TAG or UN-TAG a file, move the mouse cursor to that
row and click the LEFT mouse button. If you don't HAVE a
mouse, press the SPACE bar.
To move to a DIFFERENT page, use PgUp or PgDn. If you
have a mouse, click middle mouse button and when you
hear a beep, click LEFT button to go UP a page or RIGHT
button to go DOWN a page.
You can press HOME to go to the FIRST page or END to go
to the LAST page.
I also make extensive use of YES/NO/CANCEL dialog boxes.
You can use the mouse, arrow keys, or tab to move to the
option you want. Click Left mouse button or press RETURN
to select.
Osiris SE Technical Reference Manual Page 108
Screen Layout
The TOP window contains miscellaneous information
such as copyright notice, name of the program and
the version number, and the name of the current
file area you're in, along with (DN) or (UP). (UP)
stands for UPload directory and DN stands for
DOWNload directory.
The MIDDLE window is 15 rows long and this is where
I'll display the file names and up to 60 characters
of the description field.
The BOTTOM window is a menu with additional
statistics.
The information is related to the number of files
tagged, total files in the area, current PAGE being
displayed and the total number of pages.
I'll show it as Page xx of xx
Using Fam
To do ANYTHING with the files, they must first be
"Tagged." You do this by moving TO the row the
file is on and clicking the LEFT mouse button or
press the SPACE bar.
When a file is tagged, the ROW it's on will be
displayed in FLASHING BLACK on WHITE, UN-TAGGED
files are white on black.
You can untag a file by following the same steps
a second time.
Move
Although MOVE works on GROUPS of tagged files, I'll
ask you, before moving each file, which area you
want THAT file moved TO. This lets you tag multiple
files from a COMMON upload area and move them to
different download areas.
I'll also ask if you want the UPLOAD date to be the
CURRENT date, so it'll show UP as a new upload.
If you select CANCEL, this will CANCEL the
remaining moves, including the current one, and
return you to the main screen.
I'll NEVER overwrite an existing file. If the file
already exits in the directory the file is to be
moved TO, I'll skip to the next file.
Osiris SE Technical Reference Manual Page 109
Kill
I'll display TWO conformation boxes. The first is
physically delete files [YES][NO]. This allows you
to PHYSICALLY remove the files from the hard drive
AND the Files listing at the same time.
If you answer NO, I'll assume you want the LISTING
to be removed and the physical FILES will be left
along.
The 2nd conformation box is your LAST chance to
BACK OUT of the operation, select [YES] to proceed.
Change Areas
Lets you switch to a different FILE area. If you
are in the UPLOAD directory, you'll go to the
UPLOAD directory in the NEW area. The same thing
holds true if you are in the DOWNLOAD area.
Upload
Changes into the UPLOAD directory for the CURRENT
file area.
Dnload
Changes into the DOWNLOAD directory for the CURRENT
file area.
Edit
This allows you to EDIT the file record(s) for the
files you have TAGGED.
The "edit record" window will appear at the top of
the screen. You'll start with the description
field and pressing <Enter> or the Down-Arrow key
will move the cursor on to the next field.
After you have edited the last field, you'll be
moved to the UPDATE, ABORT, CANCEL section of the
"edit record" window.
If you click on the UPDATE box or press 'U', I'll
save your changes.
If you click on the ABORT box or press 'A', I'll
NOT update the record, any changes will be lost,
and you'll go on to the NEXT record in the batch,
if there is one.
Osiris SE Technical Reference Manual Page 110
If you click on the CANCEL box or press 'C', I'll
NOT update the record, any changes will be lost,
and I'll CANCEL the BATCH edit and return you to
the main screen.
Info
Displays an INFORMATION window showing FULL file
information ; who uploaded file, last time
downloaded, full description, times downloaded,
etc. for the files you have tagged.
You'll also be required to click on the NEXT box or
press 'N' to go to the next file in the BATCH.
If you click on the CANCEL box or press 'C', then
the BATCH will be canceled and you'll return to the
main screen.
Orphans
Orphans are files in a file area that aren't listed
in the FILES.QBS file.
If a file has been flagged as an Orphan, the
message "Adopt Filename ?" will appear. Clicking
the YES box will adopt it. Clicking on NO will skip
it and clicking on CANCEL will abort the Adoption
process and returns to the main screen.
Arcview
Lets you view the contents of any number of
Tagged Archives.
Arcformat
Lets you change the archive format of the tagged
files to either Zip, Lharc, or ARJ.
The files ORIGINAL date/time stamps will be
retained.
Warning!!! I suggest, strongly suggest, that you do
NOT use FAM to convert Zip, Arj, Pak, and Arc to
Lharc format.
Lharc doesn't appear to clear the area it uses to
store headers, and doesn't always create the
archives correctly.
To make matters worse, it returns error level zero,
archive process successful, so I can't detect when
it DOES mess-up.
Osiris SE Technical Reference Manual Page 111
I've tested this, to make sure it wasn't a problem
with FAM, by shelling out and attempting to
use Lharc manually. It did not always work the
way it was suppose to.
Arcaddcomment
This allows you to ADD ARCHIVE comments to the
Tagged files.
ONLY ZIP and ARJ archives support archive comments
and if the archive format isn't one of those two,
it will be skipped.
You MUST make a file called "COMMENT.FAM" and place
it in your OSIRIS= directory. This file contains
the COMMENTS you want added to the archive.
If I can't find COMMENT.FAM then I'll return you to
the main screen.
WARNING!!!! DO NOT ALTER COMMENT.FAM AFTER YOU HAVE
STARTED FAM. IF YOU NEED TO CHANGE THE COMMENT.FAM;
EXIT FAM, EDIT COMMENT.FAM, AND THEN RESTART FAM.
ALTERING COMMENT.FAM WHILE FAM IS RUNNING CAN
RESULT IN SYSTEM LOCKUP.
The MAXIMUM size of the COMMENT.FAM file is 2048
bytes, a limit imposed by the archivers.
If the file size exceeds 2048 bytes, I'm not going
to use it.
Shell
Shells to DOS. Useful if you need to examine the
contents of an archive more closely.
Rename
Lets you RENAME the tagged files. I'll NOT allow
you to use the name of a file that already exits in
that directory.
Untag All
Quick method of UNTAGGING all the files at once.
Osiris SE Technical Reference Manual Page 112
Transpose
Allows you to SHIFT a file to a DIFFERENT position
in the FILES.QBS.
1. Move to the file you want moved and tag it.
2. Go to the TRANSPOSE option on the MENU and click
on it or press 'T'.
3. After the brief instructions window has closed,
move to the position BELOW the spot you want the
file moved TO and click the left mouse button or
press the SPACEBAR.
That pretty much WRAPS up everything dealing with file areas.
The File system is fairly straight forward, no hidden
gimmicks, and most of the GRUNT maintenance (sorting,
pruning, archive converting, etc...) will be handled
automatically by CAT. See section on CAT for further details.
System Bulletins
System Bulletins . . . oh yes, something you will sooner or
later need.
With the flexibility of SPL/I, adding system bulletins could
WELL be left entirely up to you.
But, I've added a few internal goodies to make bulletins easy
and flexibility. And if you still don't like the built in
ones, you're free to design your own using SPL/I.
Xxxxx.msg
Following the conference mail search, if you have that
activated, I'll look for (in the Osiris ROOT directory)
a file called XXXX.MSG with XXXX being the caller's
users record number. If it exists, I'll show and then
delete it. You can use this file to leave personal
messages to individual callers knowing they MUST read it
or at least it will be shown to them.
Warning
The message may not be shown to the person it was
originally intended for if you delete and then pack
the user records.
Osiris SE Technical Reference Manual Page 113
Accxxxx.bbs
This works like the xxxxxx.MSGs. But, xxxxx is replaced
with an access level.
Allows you to post bulletins to GROUPS of users within a
specific access level.
The ACCxxxx.BBS file should be placed in the Osiris root
directory.
Unlike the xxxxx.MSG files, this one doesn't get
automatically deleted when read.
Smart(tm) Bulletins
I will scan a file, if it exists, called bulletin.hdr.
This contains information headers about bulletins
created with bullgen.exe. I'll compare the date and
time the bulletin was created with the date and time you
were last on-line and if the bulletin has been added
SINCE then, I'll show it to you.
The dates are compared according to JULIAN dates so on
Dec 31st, you'll need to delete your old bulletins
and start fresh ones.
The bulletins are held in two files so they'll take
very little drive space.
You MUST create the bulletins in your Osiris ROOT
directory.
Bullgen needs a command line argument to tell it
what function you want.
/A . . . Add a NEW Bulletin
/L . . . List out Bulletin Headers
/D . . . Delete one or more Bulletins
Getting On-Line
Having enlightened you on the message system, file area, and
making menus, you're now about ready to try this puppy out,
ON-LINE.
To go ON-LINE, you need one of two things. A mailer front end
or IMX, Osiris front end. Since most of the Osiris sysops
run mailers, I made no attempts to have Osiris ACTUAL handle
answering the phone.
If you have a Mailer, below is a list of command line
parameters that you can use.
Osiris SE Technical Reference Manual Page 114
Required Command Line Parameters
Osiris -Bxxxx -Pxx -Nxx
-N requires the node number passed be supported by your
version of Osiris. A single line system only supports
node 1, a two line system supports node 1 and 2, etc..
-Bxxxx with xxxx being the CONNECT baud rate. Valid baud
rates, -Bxxxx, range from 300 to 9600 baud with 9600
baud handling 9600, 19200, 38400, etc. via the COMx=
environment variable.
The reason you do not pass a baud rate higher than 9600
is simple: 9600 is the highest VALID CONNECT serial rate
passed by modems, all we've seen.
Confusing Rains
Usrobotics and some of the other companies that
make v.32bis modems should be SHOT, HUNG-UP by the
HEELS, STRANGLED and anything else NASTY that I can
think of for introducing CONNECT 12000 and
CONNECT 14400 messages. Those messages are FINE for
TECH folks who really understand what they're all
about, but most of you aren't TECH oriented and
insist on actually attempting to USE those
messages.
Sorry folks, those messages were never intended for
anything other than debugging. If you insist on
using them, make sure the program that's answering
the phone KNOWS how to handle converting them to
VALID serial settings, otherwise don't expect
anything to work.
There are only two programs, that I know of, that
correctly handle 12000 and 14400, ISIS and IMX.
Valid -Pxx settings : -P1, -P2, -P3, . . . -P8.
Optional Settings
-T, Time Till Next Event
-Txxxx time to your mailer or front-ends next
scheduled event with xxxx being the number of
MINUTES.
I'll adjust the callers time per call to ensure
this is not missed.
Osiris SE Technical Reference Manual Page 115
-M, Memory File
If you don't have EEMS or LIM 4.0 memory, I can
write the VMS memory map to any drive/directory (A
Ram Drive for instances) you want.
e.g. -MD:\
Both Drive and Directory must be specified and you
must have 384K of free space available.
-L, Local Mode
This means running in LOCAL mode, ignore the
absents of carrier.
-K, No Multi-Tasker
Certain NETWORK drivers use the same signature as
Desqview or Double Dos.
-K tells me to IGNORE any SIGNATURE and assume NO
multi-tasker is available. This prevents me from
making TIMESLICING calls to something that doesn't
exist.
-Hxxx
Tells me to load user record xxxx and jump directly
to the main menu. Generally used by the sysop for
QUICK and DIRTY local log on.
-Cx
The default currency symbol is the dollar sign. If
you're outside the United States you'll need a
DIFFERENT currency symbol for the ON-LINE STORE
(tm).
x is the ASCII character you want me to use for a
currency symbol.
e.g.
-C#
use pound sign.
Osiris SE Technical Reference Manual Page 116
-X
No internode chat allowed, don't waste time
checking.
Something that can drain system resources is
checking for internode email. I've attempted to
design it so that it's a minimal drain, but never
the less, it still is a drain.
If you only have a half dozen or so nodes hooked to
a network, the drain may never be noticed. If you
have a lot of nodes, the exact number will depend
on the TYPE of network and your equipment, you may
want to disable internode chatting to reduce server
demand.
If you're running under Desqview, disabling
internode chat will show a speed up if you're
running more than two nodes.
It may be enough to JUST limit internode chatting
to SPECIFIC nodes. That's why it's a command line
switch instead of a blanket configuration option.
The only way to really tell is to experiment with
your set up.
-Oxxxx
-Oxxx lets you define the size of the memory block
that is allocate to the Osage editor. The default
is 256K and should be enough for most systems.
If you're running DESQview, you may need to
increase this to 384 or higher.
e.g. -O384, -O512, -O640
-Sxxxx
-Sxxx lets you define the size of the memory block
that is allocate to the statistics overlay. The
default is 256K and should be enough for most
systems.
If you're running DESQview, you may need to
increase this to 384 or higher.
e.g. -S384, -S512, -S640
Osiris SE Technical Reference Manual Page 117
Comport.dat
Osiris has its own internal high speed serial driver and
needs no external driver such as a fossil to run. Osiris
supports baud rates up to and including 115,200 baud.
Osiris uses a COMPORT.DAT file that defines the standard
serial port information such as interrupts, addresses, etc.
You may edit this file using OSM if you need to change any
definition to accommodate non-standard serial ports.
The information in this file is in BASE 10, not in HEX.
If you do NOT have a mailer, see section on IMX later on in
this document. You'll need to use the IMX.EXE program,
included within the package.
Before you go on-line, you may want to edit the NODE1 Control
file. Osetup used some default settings, which you may want
to change.
Nodexx.ini
Many settings are held in a file called NODExx.INI with xx
being the node number for that node.
Osiris SE Technical Reference Manual Page 118
A NODExx.INI contains:
2400 ; Slowest Baud Rate for ANSI (3,12,24, and 9600)
0 ; shell Memory ( In Kilobytes, 0 = All)
256 ; Memory Required for Protocol Drivers ( In
Kilobytes, 0 = All)
0 ; Memory Required for Archivers ( In Kilobytes, 0 =
All)
0 ; Duplicate Upload Search TYPE (0 or 1)
12 ; 16550 Uart fifo Size ( 2 - 16, Greater than 12
Not recommended)
240 ; Serial Transmit Buffer Size for 300/1200 baud (
240 - 8196)
512 ; Serial Transmit Buffer Size for 2400 baud (
240 - 8196)
8196 ; Serial Transmit Buffer Size for 9600+ baud (
240 - 8196)
Yes ; Allow Caller to PICK Password (Yes/No)
Yes ; Use EMS Memory (Yes/No)
No ; Duplicate Phone Number Check (Yes/No)
Yes ; Use direct screen writes (Yes/No)
5 ; In active time out (In Minutes)
10 ; New User Time Limit (In Minutes)
1 ; Log on timer (In Minutes)
14 ; Days BACK to check New bulletins for NEW callers
Yes ; Enable Duplicate Upload check (Yes/No)
0 ; Keyboard/Clock per cycle (Recommend 30 if DV is
used)
Off ; Accounting system (On/Off)
1 ; Amount to charge (In Pennies).
1 ; Per minute of connect time (In Minutes)
1 ; Out of credit access Level (1-32722)
1 ; New Caller Credit (1-32722)
00 01 Chat ; Chat for Mon.
00 01 Chat ; Chat for Tue.
00 01 Chat ; Chat for Wed.
00 01 Chat ; Chat for Thu.
00 01 Chat ; Chat for Fri.
00 01 Chat ; Chat for Sat.
00 01 Chat ; Chat for Sun.
Yes ; Check new upload for Virus Infestation
c:\osiris\cmds.dat
e:\menus
Lines must NOT begin with a BLANK and first argument
must have at least one BLANK SPACE following it.
Line 1: The slowest baud rate you'll allow for ANSI.
Line 2: Amount of FREE Memory you want available when
you do a SHELL to DOS.
Osiris SE Technical Reference Manual Page 119
Line 3: Amount of FREE Memory you want available when
you call protocol drivers.
Generally speaking, 256K is enough for almost any driver.
Line 4: Amount of FREE Memory you want available when
you call Archivers. Almost all archivers can function in
384K.
Line 5: This specifies the search TYPE used during the
duplicate upload file search. Type 0 does a perfect
match. Type 1 does a slide type match
Line 6: Refers to the number of bytes to send to the
UART when a TX interrupt is triggered. This is ONLY used
if you have a 16550 Uart installed. If you have a fast
machine you may find that a lower value yields the same
results as the default 12. If you have a slow machine
(XT) or your running Desqview you may need to RAISE it
to achieve maximum speed.
Line 7 :
Line 8 :
Line 9 : These lines reference the SIZE of the Transmit
buffer I'll use at different baud rates. Valid sizes
range from 240 bytes to 8196 bytes. The larger the
buffer, the more space I have to send characters to the
modem without being halted or slowed down by the baud
rate.
Even thou I will SLICE time to other partitions, it
isn't always effective if you slice away more time than
it takes to empty the TX buffer.
e.g.
If you're using DV and you are running 3 lines with a
combined TIC count of 18 and you have a caller on-line
at 2400 baud with a TX buffer size set to 240 characters
for 2400 baud.
The TX buffer will fill and the remaining time will be
given to the other partitions. 240 characters, what's in
the TX buffer, will be sent in 1 second at 2400 baud.
But, you've sliced to the other partitions and they'll
use roughly 1 second before the original partition gets
any more time. This will cause the caller to get a
JERKY display.
If you're running a multi-tasker, I would recommend
that your buffer size(s) be no smaller than what is
listed above. If you have more than 3 lines, You may
need to make them even larger.
Osiris SE Technical Reference Manual Page 120
Having LARGE buffers does affect the caller if he is
using HOTKEYS. The closer to the MAXIMUM CPS * 1.5, the
better HOTKEYS work.
Tx Buffer Sizes for Hotkeys to be most effective.
300/1200 : 240 (actual 180 but i don't allow one that
small)
2400 : 360
9600 : 1440
If you're running DV, then you have to weight the pro(s)
and con(s) and decided for yourself which you want.
Line 10 : By Default, I will only allow the caller to
pick the first character of his or her password and
I'll generate the remaining characters. This foregoes
having a caller use the same password on several systems
and makes HACKING more difficult.
If you want to allow the caller to pick the ENTIRE
password, then use "Yes," otherwise, "No."
Line 11: If you have EEMS 3.2 or LIM 4.0, setting this
to "YES" allows the VMS system to do memory swaps to
high memory instead of using your disk.
Line 12: Duplicate phone number checking, as far as I
can tell, serves no useful purpose. If someone is going
to have two log on names to your system, they aren't
dumb enough to use the same phone number for both.
If you want duplicate phone number checking, answer
"YES," otherwise "NO." If you're running on a NETWORK
you may want it disabled to reduce the drain on the file
server.
LINE 13: This allows you to turn off direct screen
writes in lent of a slower BIOS write. This only serves
to slow things down and may soon be removed as an
option.
LINE(s) 14, 15, and 16 refer to internal timers, in
Minute increments. In active timer means NO input from
the caller. It is suggested that you go no higher than 5
minutes.
New User Time Limit means the AMOUNT of time a caller is
given to FILL OUT the new user record. It does NOT
reference the amount of time for the CALL.
Osiris SE Technical Reference Manual Page 121
LOG on Timer is the amount of time a caller is given to
enter their name and password. It is suggested that you
keep this low, about 1 minute, to avoid long connects
with a FAX or MAIL System that may fall thought to your
BBS by mistake.
LINE 17: The number of days the bulletin system will
check BACK for new bulletins for NEW CALLERS.
LINE 18: Duplicate upload search checks your Upload and
Download directories to see if the file the caller is
about to upload already exists on the system.
I suggest that you always keep this set ON.
LINE 19: Certain system calls under multi-taskers such
as Desqview can greatly reduce the amount of CPU
time available to other partitions. Checking the
keyboard, system clock, etc. are just a couple. This
switch allows you to limit the number of times
Osiris will scan certain system functions when
running under Desqview.
30 seems to produce about a 50 percent speed increase
when 2 lines are in use. Higher values may produce
better results when more than 2 lines are being run on
the same machine. I suggest that you go no higher than
90.
LINE 20, 21, 22, 23 and 24 reference the time billing
system. Line 20 turns it on and off while lines 21 - 24
reference billing settings.
LINE(s) 25 - 31 : This is where you define the times
that you will allow Sysop Paging.
The first item is the STARTING HOUR, in military format
for the page. The Second item is the ENDING HOUR, again
in military format for the page. Page times must begin
and end on an HOUR and MINUTES are not supported, ie. 10
is legal while 10:30 is not.
The third item is the name of an ASC, MMU, or ANS file
to show if Chat is NOT allowed. The file can say
anything you like and can be different for each day.
LINE 32 : Enables virus checking on new uploads. Each
new upload is scanned for viruses using McAfee's
SCAN.EXE program. The archive is pulled apart and each
individual program is scanned. SCAN.EXE should be in
one of your PATHED directories.
Osiris SE Technical Reference Manual Page 122
The testing takes very little time, generally less than
25 seconds per upload, and can save a lot of maintenance
time. Time that WOULD have to be spent manually testing
each file.
LINE 33 : Contains the full drive, path, and filename
for the language control file.
Line 34 : The full drive and path to the ASC/MMU/ANS
files. This allows individual nodes on a NETWORK to keep
separate copies of the menus on LOCAL hard drives or
on an EMS/Extended Memory RAM disk. This can GREATLY
reduce SERVER demands.
Each node must have its own control file which allows you to
alter node settings without messing with command line
switches.
This means all available settings are laid out right in front
of you and you don't have to dig out the SE documentation to
figure out how to set what.
You have to compile the NODExx.INI before I can use it. The
Compiler option is in OSM, under MISC sub-system.
Osm
Osiris System Manager
Overview
OSM is a GUI (Graphics User Interface) System Manager
for Osiris SE.
To run, type OSM from the DOS command line, no
parameters are needed.
Main Display
The main menu has the following options: Quit,
File, Msg, Sysinfo, Misc, Dbase, Store, Main, and
finally Access.
Move to the option you want using either the space
bar, left arrow key, or right arrow key, and press
RETURN.
Many of the options have submenus associated with
them.
Osiris SE Technical Reference Manual Page 123
File
File Has two sub-menus, EDIT/VIEW and Area Stats.
EDIT/VIEW allows you to edit, view, or add file
boards. This option has many sub options of its
own.
Area Stats gives you statistical information about
your file areas.
Msg
Msg has three sub menus: Edit/View, Area Stats,
and Echo Flags.
EDIT/VIEW and Area Stats does what their FILE
counter parts do only with the message areas.
Echo Flags allows you to reset the echo flags.
Access
You define, view, and edit your access level
information from this section.
Sysinfo
You define, edit, and view your Osiris System
information from here.
Main
Define, edit, and view your main menu settings
from this section.
Before moving on to some of the other more complex
main menu options, there's some information that
pertains too almost all the functions I've spoken on
so far.
Jump
The Jump command, found under the MSG, FILE,
AND ACCESS options, allows you to go directly to a
specific record. In respects to the file boards and
message boards, a vertical window will open
displaying the names of the areas. Use the arrow
keys, PgDn, PgUp, or space bar to move to the area
you're interested in and press RETURN.
When in the Access area, you'll simply be asked to
enter the access level you want to go to. Only
valid access levels will move you. If you enter one
that isn't valid, your request will be ignored.
Osiris SE Technical Reference Manual Page 124
Clone
The Message, File, and Access level sections
also have a feature called Clone.
This duplicates the existing record, the one your
viewing. To reach the duplicate record, press END.
The cloning process is very fast, usually less than a
second. Because it's so fast and you may need to
quickly clone the record several times, no message
that the cloning process was completed will be
shown.
You'll only get a message if the cloning process
could NOT be completed.
Mass
The Message and File board sections both have an
option called MASS. This allows you to pick out one
of the menu command keys from a vertical menu. Once
the key has been selected, you'll be asked for the
command key to use for it, the access level, and
the flag settings.
That key on ALL records or boards will then be
changed to the NEW key you've just defined.
Delete
Sub-Sections MSG, FILE, and ACCESS will allow you to
delete records, but you can only safely delete a file
board.
Deleting an access level or Message board can
lead to complications if that access level or
message board isn't the very last one listed.
If you delete a message board from the middle, all
HDRxx.sys and TXTxxx.sys files will be thrown off.
Your Echo control files, if you're running
echomail, will also be thrown off. It's suggested
that instead of deleting a message board, you
raise the access level or set the area flags so
that no one can get to it. In other words, save it
for reuse or until you get enough of them to
warranty the additional work involved in deleting
message boards.
Osiris SE Technical Reference Manual Page 125
Deleting an access level isn't quite as bad, just be
aware that the users with access level equal to or
higher than the one you're going to delete will
find themselves with the privileges associated
with the next highest access level (time limits and
such).
Delete will also not allow you to delete the
very first record. This'll keep you from
deleting yourself to a zero byte file structure and
OSM doesn't like zero byte files.
Verify
The MSG Sub-System has an option called Verify.
This verifies that the TXTxxx.sys and HDRxxx.sys
files exist for all message boards defined. If one
doesn't, OSM will create it.
Dialog Confirmation Box's
No permanent change to any item will be made
without double checking with you. In other words, you
ALWAYS have the option of backing out of
anything.
Before the operation starts, a dialog box
will open with a YES/NO continue with operation
prompt.
Move the selector, arrow keys or tab key, to NO if you
want to cancel. Otherwise, press RETURN to signal
OK.
Osiris SE Technical Reference Manual Page 126
Edit Mode
When selecting to Edit a record, you'll be place in
FULL Screen FULL field editing mode.
Editing Individual Fields
Backspace * Destructive backspace to the left.
CTRL-CURLF * Control left arrow moves one word
left.
Ctrl-Currt * Control right arrow moves one word
right.
Curlf * Left arrow key moves one position
left.
Currt * Right arrow key moves one position
right.
Delete * Del (on keypad) delete character under
cursor.
End * Move cursor to end of string.
Esc * Clear string.
Home * Move to beginning of string.
Insert * Insert a space under cursor.
Screen Movement
Up Arrow & Reverse Tab - Move the cursor to
the previous field.
Down Arrow, Return, Tab - Move the cursor to the
next field.
Pgup & Pgdn - Move the cursor to the previous or
next field respectively
Ctrl-Home & Ctrl-End - Move the cursor to the first
or last field respectively.
Ctrl-Return - Always End Edit Session.
Flags
Osiris SE is loaded with Flags. Each command has 16
flags associated with it. While file areas and message
areas have 8 flags.
OSM displays the flags as a string of zero's '0'
and one's '1'.
A command key flag field will look somewhat like
this;
1000100000100000
Osiris SE Technical Reference Manual Page 127
To turn a specific flag on, change the zero to a
one. To turn it off change the 1 to a 0.
The flags are numbered (for your reference) from
left to right starting with flag #1.
In the example above, flags 1, 5, and 11 are
turned on.
Misc
The MISC main menu option has the following
SUBSYSTEMS available:
Protocol
Here you define, edit, delete, or view the
protocol definitions for Osiris. It's
completely Menu (vertical selector) driven so
you should have no problems using it.
Sig
This section deals with defining,
removing, and cleaning SIG Email conference
areas.
Com Port Defs
Replaces the old comport.exe file and deals with
defining com port information. This section should
RARELY be used and only by those with the
technical background to understand what is what.
Nodexx.ini Compiler
Does the actual compiling/compressing of the
nodeXX.ini file.
Dbase
Dbase is used to create and maintain SPL/I database
systems.
Pack Db
This removes DELETED records and rebalances the
Btree indices. You'll be asked for the name of
the database.
Osiris SE Technical Reference Manual Page 128
This is the FIRST part of the name minus the
extension. All Dbase functions will supply the
needed extensions.
Make Db
This is the one you use to originally define the
SPL/I database structure. The number and lengths
of the fields as well as the index field and name
of the database.
Add Db
Allows you to mass add to a Btree database using a
TEXT formatted control file containing the
information to add.
The fields within this text file should be
delimited by @.
All fields for a particular dbase record must be on
ONE line.
Line Length isn't important.
Mouse
OSM will automatically detect and allow you to use
your mouse for menu selection and to some extent,
when in full screen or full field editing. OSM
supports a two button mouse or , preferred, a
three button mouse.
Vertical Menus
You can use your mouse to select the option
you want by moving the inverse bar to that
option and pressing the LEFT mouse button. If
you have a 3 button mouse, your middle button
will allow you to BACK OUT without selecting
anything. If you have a 2 button mouse, press
the ESC key on your keyboard. Horizontal or
sometimes referred to as LOTUS style menus.
They run ACROSS the screen instead of up and
down.
Osiris SE Technical Reference Manual Page 129
You can use your mouse to select the option
you want by moving the inverse bar to the
option you want and pressing the LEFT mouse
button. If you have a 3 button mouse, your
middle button will allow you to BACK OUT
without selecting anything. If you have a 2
button mouse, press the ESC key on your keyboard.
Standard Menu This is the STANDARD Keyboard menu
display at the bottom of a secondary screen. It
generally consists of something like: ESC Edit
Jump -> <- Delete You can use your mouse to
select one of these options by moving the
mouse pointer to the TEXT or within one space
on either side and pressing the LEFT mouse
button. If the text is enclosed within a box,
just move INSIDE the box and click your
left mouse button.
Editing
When you are required to actual EDIT a field or
record, your mouse buttons can be used, even
thou you will not see any type of MOUSE CURSOR.
Left Button : Acts as if you had pressed the
Enter Key on your keyboard. Can be used to
page THROUGH fields to get to the one you
want or to accept what's in the field. RIGHT
Button : This can be used to QUIT edit
mode. It's similar to pressing CTRL- RETURN.
Middle Button : This will CLEAR the current
field. If you do NOT have a Middle Button, you
will have to press ESC on the keyboard.
Confirmation Box
After editing/changing some fields, you
will get a Confirmation box on the screen
asking if you really want to save the data.
Just move the mouse cursor to the OK or CANCEL box
and click the LEFT mouse button.
Cat.exe
Osiris Robot Maintenance system.
Cat's the Osiris Robot maintenance system. It handles all the
GRUNT work of cleaning and verifying message areas, file
areas, sorting file areas, converting archive formats, etc.
You should run CAT once a day or once every two days to keep
your system in top form.
Osiris SE Technical Reference Manual Page 130
Cat's Report To You
Every time CAT's run, it will generate a system report
and place it in the message center, addressed to you.
The report will list everything CAT did during its run
and look something like this.
Osiris SE Technical Reference Manual Page 131
Message Center Mail : Delete Received after 10 Days
Delete Un-Read after 45 Days
~ Validating Msg Areas and Message Pointers.
~ Packing Message Center.
~ Relinking Reply Threads.
~ Relinking User Records.
~ Rebuilding Mail Index File(s).
~ Scanning Upload Directories for NON-LZH Archives.
~ Checking Osiris SE Rev 2.02.
{ Converted Oilcap2.zip to Oilcap2.Lzh.
~ Checking Isis, Intergrated mailer.
~ Checking Registration Keys.
~ Checking Bug/Sug.Frms Go Here.
~ Checking Archivers.
~ Checking Odds & Ends.
~ Checking Games.
~ Checking Beta *Use at YOUR Risk*.
~ Sorting By Date (Descending Order).
~ Sorting Osiris SE Rev 2.02.
~ Area Contains 38 Downloadable Files.
~ Sorting Isis, Intergrated mailer.
~ Area Contains 4 Downloadable Files.
~ Sorting Protocol Drivers/Qt 2000.
~ Area Contains 11 Downloadable Files.
~ Sorting NAMvet Newsletter(s).
~ Area Contains 5 Downloadable Files.
~ Sorting Arcshell, Ultimate Archive Utl.
~ Area Contains 1 Downloadable Files.
~ Sorting Registration Keys.
~ Area Contains 0 Downloadable Files.
~ Sorting Odds & Ends.
~ Area Contains 21 Downloadable Files.
~ Sorting Games.
~ Area Contains 25 Downloadable Files.
~ Sorting Beta *Use at YOUR Risk*.
~ Area Contains 6 Downloadable Files.
~ System Has 117 Downloadable Files.
~ Indexing Download Area(s).
~ Indexing UPload Area(s).
~ Creating Download AREA Index.
{ Warning : Area 6 Empty.
{ Warning : Area 7 Empty.
~ Packing History Log For Node # 1.
Entries IN 402 : Entries OUT 374.
~ Doing File Integrity Check.
~ Scanning System for Known Viruses.
~ No VIRUS Found.
~ Doing File Integrity Check.
{
C:\AUXPRGS\TNTBBS.EXE Failed Integrity Check!
Osiris SE Technical Reference Manual Page 132
Cat.cfg
Cat requires a control file to tell it WHAT to do. The
name of the control file is CAT.CFG (A default CAT.CFG
is included) and must be in the OSIRIS= directory.
CAT.CFG contains :
Delete received 10
Delete OLD files <Day of Month> <Days Not Downloaded>
Make Filelist <CTRL FILENAME> <HEADER FILE> <ARCHIVE COMMAND>
delete unread 30
Conference Stats <DAY OF WEEK>
Check Message Areas <DAY OF WEEK>
Backup Message Center <DAY OF WEEK>
Backup Files.Dat <DAY OF WEEK>
Backup User Records <DAY OF WEEK>
Rebuild Files.qbs Indices <DAY OF WEEK>
File Sort Type 6 <DAY OF WEEK>
;
; File Sort Type's are as Follows . . .
; 0 = No Sort
; 1 = Sort By Name (Ascending Order)
; 2 = Sort By Name (Descending Order)
; 3 = Sort By Size (Ascending Order)
; 4 = Sort By Size (Descending Order)
; 5 = Sort By Date (Ascending Order)
; 6 = Sort By Date (Descending Order);
Archive Type 1 <DAY OF WEEK>
; Archive Type's are as Follows . . . .
;
; 0 No Conversion.
; 1 Lharc (Uses LHARC.exe)
; 2 Arj (Uses ARJ.EXE)
; 3 Zip (Uses Pkzip/Pkunzip.exe)
; Archives MUST be in one of the directories defined in
; your PATH= statement.
History 1
;
;
Delete Old Bulletins <DAYS OLD>
Run External <FILENAME> <DAY OF WEEK>
Post Conference <DAY OF MONTH> <AREA> <FILE> <SUBJECT>
Post Bulletin <DAY OF MONTH> <FILE> <SUBJECT>
Delete User Records <Day of Month> <Days Old>
VIRUS CHECK SCAN C: D: E: /NOPAUSE /REPORT C:\OSIRIS\VIRUS.MSG /M
VIRUS CHECK TBSCAN C: D: E: -allmem -log -batch
TEST E:OVL01819.EXE 13457893123
Osiris SE Technical Reference Manual Page 133
Explanation
<Day Of Week>
Several of the CAT.CFG commands were followed by
<DAY OF WEEK>. This is the day or days you want
CAT to execute this particular command.
Valid day of week designators are:
MON
TUE
WED
THU
FRI
SAT
SUN
You may stack multiple days on the same line.
E.g., Check Message Areas MON WED FRI
<Day Of Month>
Several options require a DAY of the MONTH to run.
E.g., Delete User Records 1 185
Cat will delete users on the 1st day of the month.
Although you may NOT stack day of the month
designators, you may use multiple lines if you
want to run it more than once a month.
E.g. Delete User Records 1 185
Delete User Records 15 185
Cat will delete users on the 1st or the 15th.
Delete Received
1 - 365
References the number of days to allow
RECEIVED messages to remain in the message center.
See sample CAT.CFG for proper settings.
Osiris SE Technical Reference Manual Page 134
Delete Unread
1 - 365
This is the number of days you want to allow UNREAD
messages to remain in the message center. I'll NOT
delete any message as long as it still has an
active file attach.
Backup Message Center
<DAYS TO RUN>
You have the option of having the two MESSAGE
CENTER databases backed up to a ZIP file. I'll
make a COPY of the two files, but I'll use a file
extension based on the JULIAN date.
E.g. Backup Message Center MON WED FRI
Backup Message Center FRI
If you do not want to backup the message center,
simply leave this command out of the cat.cfg or
comment it out by placing a semi-colon in column 0.
Backup Files.dat
<DAY(s) TO RUN>
Gives you the option of having the secondary
FILES.DAT file backed up to a ZIP file. I'll make a
COPY of the file, but I'll use a file extension
based on the JULIAN date.
E.g. Backup Files.Dat MON WED FRI
Backup Files.Dat FRI
If you do not want to backup the Files.Dat, simply
leave this command out of the cat.cfg or comment it
out by placing a semi-colon in column 0.
Backup User Records
<DAYS TO RUN>
Gives you the option of having the user records
backed up to a ZIP file. I'll make a COPY of the
file, but I'll use a file extension based on the
JULIAN date.
E.g. Backup User Records MON WED FRI
Backup User Records FRI
Osiris SE Technical Reference Manual Page 135
If you do not want to backup the user records,
simply leave this command out of cat.cfg or comment
it out by placing a semi-colon in column 0.
All BACKUPS will be placed in a file called
"BACKUPS.ZIP."
Rebuild Files.qbs Indices
<DAYS TO RUN>
This tells me to rebuild the secondary file index
system. Since we've been using this secondary
indexing system, I've never heard of one going bad.
Because of this, I don't think you should worry
about having this rebuilt every single day.
E.g. Rebuild Files.Qbs Indices MON WED FRI
Rebuild Files.Qbs Indices FRI
File Sort Type
0 - 6
<DAYS TO RUN>
If you want your DOWNLOAD areas sorted, select the
SORT method (listed above). If you don't, set it to
Zero.
During the SORT operation, I'll also FIX all the
file listings for that area. By FIX I mean I'll
convert the file name and the file description to
BBS CASE to give the system a uniformed look.
I'll also strip any LEADING and TRAILING blank
spaces from the description field.
E.g. File Sort Type 1 MON WED FRI
File Sort Type 1 FRI
I'd recommend that you only do this on the day(s)
you move new uploads to their respective download
areas.
Running it when you don't or haven't moved in new
uploads serves no useful purpose after the first
time.
Running the sort feature will automatically engage
Rebuild Files.Qbs Indices even if it wasn't set to
run on that particular day.
Osiris SE Technical Reference Manual Page 136
Archive Type
0, 1, 2, or 3
<DAYS TO RUN>
Here you define the default archive type, if any,
and the day or days of the week you want this to
run.
This is the archive format you want all new uploads
to be placed in.
Cat will scan your upload directories and convert
any file not in the proper format.
I suggest, for the sake of speed and time, that you
set this to run on the day or days you plan on
moving new uploads to their respective download
areas.
E.g. Archive Type 1 MON WED FRI
Archive Type 1 FRI
Running the archive convert feature will
automatically engage Rebuild Files.Qbs Indices even
if it wasn't set to run on that particular day.
Check Message Areas
<DAY OF WEEK>
Each time you run Cat, I'll validate the message
base pointers for each area. If any message base is
missing, I'll create it.
Every time you define a new message area, in OSM,
you were asked to define a pack level and a pack
trigger level.
When I see an area that exceeds the pack trigger
level, I'll trim the area back to the pack level.
This keeps the individual message bases down to
size.
When an area has deleted messages, I'll also
PACK the area to get rid of the messages.
Validating the pointers needs to be done on a daily
bases. Not that they are easy to get off, but it
is best, especially when echomail is involved, not
to take chances.
Osiris SE Technical Reference Manual Page 137
However, you may NOT need the pack trigger level or
the deleted messages checked every single day.
Especially if you have enough hard drive space to
allow them to go OVER the trigger level.
The reason you may want to relax this part of the
check is disk fragmentation. Packing a message area
does generate some fragmentation and can take a lot
of time, specially if you keep a lot of messages
on-line.
Check Message Areas <DAYS TO RUN> is used to govern
this part of the message area maintenance section
in Cat.
I will only TEST the Trigger levels and watch for
deleted messages on the day or days you specify.
Of course, if you handle a LOT of echomail or
you have a marginal amount of free disk space,
you may need to do it every day.
E.g., Check Message Areas Mon Wed Fri
Check Message Areas Sun
History
1 - 255
This is how I find out WHICH HISTxx.LOG file to
keep trimmed back to 14 days.
You supply the NODE number following the key word
HISTORY.
e.g. HISTORY 1
HISTORY 2
HISTORY 3
You can have up to 255 HISTORY commands listed in
CAT.CFG
Delete Old Bulletins
<DAYS OLD>
This references the SYSTEM bulletins you've posted
using Bullgen. Cat will delete all the bulletins
that are older than <DAYS OLD>.
E.g., Delete Old Bulletins 21
Remove bulletins older than 21 days.
Osiris SE Technical Reference Manual Page 138
Delete User Records
<Day of Month>
<Days Without Calling>
Allows cat to keep your user records trimmed down
to size by deleting inactive users. Inactive being
defined as "Users that haven't called within XX
days."
<Day of the Month> is the day, integer format from
1 to 31, of the month.
If you want to run the check on more than one day,
you can have multiple "Delete User Records" listed
in the cat.cfg file.
E.g., Delete User Records 1 185
Check the user records on the 1st of the month and
delete anyone that hasn't called in 185 days,
roughly 6 months.
Post Conference
<Day of Month>
<Area>
<File>
<Subject>
This lets you automate the posting of a specific
message, like echo area rules, on a particular day
of the month.
<Day of Month> is the day, integer from 1 to 31, of
the month to post the message.
<Area> is the Conference message area, 1 to the
highest area you have defined, the message is
suppose to go in.
<File> is the name of a text file, one created with
MKPOST.EXE, that contains the body of the message.
<SUBJECT> is the text you want used as the SUBJECT
of the message. Do NOT exceed 38 characters. I do
not check this and if you exceed 38 characters you
will corrupt the message area.
Osiris SE Technical Reference Manual Page 139
E.g.,
Post Conference 1 10 c:\osi\rules.txt Echo Area Rules
On the 1st of the month post a message in area 10.
Use the text file c:\osi\rules.txt for the message
body and use "Echo Area Rules" as the subject of
the message.
There is no limit to the number of "post
conference" commands you can have in your cat.cfg
file.
Post Bulletin
<Day of Month>
<File>
<Subject>
This lets you automate the posting or reposting of
a specific system bulletin, like system rules, on a
particular day of the month.
<Day of Month> is the day, integer from 1 to 31, of
the month to post the bulletin.
<File> is the name of a text file, one created with
MKPOST.EXE, contains the body of the system
bulletin.
<SUBJECT> is the text you want used as the SUBJECT.
Do NOT exceed 38 characters. I do not check this
and if you exceed 38 characters you will corrupt
the message area.
E.g.,
Post Bulletin 15 c:\osi\Sysrules.txt System Rules
On the 15th of the month post a message in area 10.
Use the text file c:\osi\Sysrules.txt for the
bulletins body and use "System Rules" as the
subject.
There is no limit to the number of "post bulletin"
commands you can have in your cat.cfg file.
Conference Stats
<Day of Week>
Adds a fairly detailed report on your conference
message area usage; who, what, when, how many, etc.
to the daily maintenance report.
Osiris SE Technical Reference Manual Page 140
Delete Old Files
<Day of Month>
<Days Not Downloaded>
This option certainly isn't for everyone and if you
don't want to use it, don't include the command in
your cat.cfg file.
This option scans the download file areas on <Day
of Month> and deletes any file that hasn't been
downloaded in <Days Not Downloaded>.
This conserves diskspace by removing files people
don't want. If they aren't downloading the file,
there is no point in taking up valuable disk space
storing it.
E.g. Delete OLD Files 30 185
On the 30th day of the month, delete any file that
hasn't been downloaded in 185 days, roughly 6
months.
In order for a particular file area to be scanned
, you must set Applications Flag 1(ONE) ON. On
means putting a 1 in the first slot. You can find
the Applications Flag in the Filboard definition
record for that area, use OSM.
E.g. 1000000000000000
If the flag isn't on, CAT will not check that file
area.
This lets you "DELETE OLD FILES" in some
file areas while excluding files in another area.
Make Filelist
<CTRL FILENAME>
<HEADER FILE>
<ARCHIVE COMMAND>
The Make Filelist Option generates a TEXT
listing of selected FILES.QBS files.
This is generally used as a File Request list or
to offer callers a text listing they can down load
and read off line.
'Make Filelist' requires a control file, you
can pickout the name and it is the FIRST argument
following the KEY Phrase "Make FileList".
Osiris SE Technical Reference Manual Page 141
The control file contains two lines. The first line
is the full drive, path, and file name that is to
be used for the TEXT listings.
E.g. c:\osiris\files\filelist.txt
The second line contains a list of the Osiris File
areas to add to the TEXT listing. The list
consists of the numeric area number, up to 500,
separated by a blank space. All areas MUST fit on
ONE line.
e.g. 1 2 3 4 8 11 23
Example of a control file
c:\osiris\files\general\filelist.txt
1 2 3 4 5 6 8 9 10 11 12 13
<EOF>
The second argument is the name of a text HEADER
file to insert at the TOP of the list. This file
may contain almost anything but is generally used
to display the name of your BBS.
The third and final argument is the complete
archiving instructions.
E.g. arj m -e -jm d:\general\filelist filelist.txt
Example of a complete Make FIlelist statement
Make Filelist Flist.ctl fist.hdr arj m -e -jm d:\flist filelist.txt
You can add multiple "MAKE FILELIST" commands to
the cat.cfg file if you want to create MULTIPLE
listings.
Run External
<Filename>
<Days to Run>
You may have applications or maintenance programs
that are not directly related Osiris that you'd
like to run on a scheduled bases.
"Run External" allows you to define programs,
generally batch files, along with the day or days
of the week you want them to run.
Osiris SE Technical Reference Manual Page 142
There is no limit to the number of programs you can
define and they will have at least 512K of free
memory to run, providing you had 512K free BEFORE
you ran cat.
E.g. Run External HDMAINT.BAT MON WED SAT
Virus Check
If you want a SYSTEM wide virus scan run during
your maintenance event, use this verb.
Place the name of the virus checking program and
any command line settings following the key words
VIRUS CHECK.
I've defined TWO for you, one for Mcafee's SCAN.EXE
and one for TBSCAN.COM.
Uncomment the one you want to use and edit to suit
your system.
You'll need to change the " C: D: E:" to go along
with YOUR drives. You may also need to
change the "C:\OSIRIS\VIRUS.MSG". This is the
file SCAN.EXE uses to LOG any files that may
contain a virus. TBSCAN.COM will use "TBSCAN.LOG"
and you'll find it in your OSIRIS= directory.
You may define a TOTALLY new program to replace
either of these. Just include the name of the
program along with any command line switches.
There are two restrictions. The program must return
error level 0 if no viruses were found. It must
return 1 or higher if a virus WAS found.
The command line, including the name of the
program, can't exceed 128 characters.
Disadvantages!
Virus scanners have several very
serious disadvantages! They can only
recognize viruses that have already
been identified. When a new virus has
been launched it will take a while before
someone discovers it. After that it will
take sometime before a reliable signature
is distilled from the virus and it will
also be a while before you can get the new
scanner.
Osiris SE Technical Reference Manual Page 143
All this means that there is a real
chance that your system is infected at this
moment by a virus the scanners have not
yet recognized! Because of all the attention
the media is paying to the computer
virus, it has become a real sport for
sick minds to write computer viruses.
Even viruses that have no stable
signature have already been
discovered. Some Virus scanners allow
wild cards in the signature and can still
trace this kind of viruses, some times. But
it will not be long before viruses
will be created that have no special
characteristics by which they can be
identified. The solution to this problem
is the CAT FILE INTEGRITY SYSTEM.
Cat File Integrity System
This engages the CAT FILE INTEGRITY system. Cat
will computer an Integrity checksum for the file
you've defined and if it doesn't match the
integrity checksum you've listed, it will be
flagged as infected with an Unknown virus. One the
virus checker didn't know about.
You define a file by using the key work TEST.
Following TEST include the FULL drive, path, and
the name of the file to check and the Integrity
Checksum for that file.
e.g. TEST C:\OSIRIS\OSM.EXE 3459123475
There is no limit on the number of files you can
define for testing.
There are several advantages to using this system
over the normal virus check (SCAN.EXE). It can
detect changes in a file and it doesn't have to
know anything about the virus that did it. New
virus comes along, doesn't matter. It'll be
detected if it does anything to the files you've
defined.
The 2nd big advantage is speed. This system is 10
to 20 times faster than using SCAN.EXE to do a
system wide virus scan.
Osiris SE Technical Reference Manual Page 144
Chksum.exe
Chksum.exe can be used to generate the
file's original integrity checksum.
Chksum.exe requires one of three possible
command line switches.
/Ffilename : Computer a file integrity
checksum on "filename."
eg. /FC:\OSIRIS\CAT.EXE
If this switch is used, the file integrity
checksum will be displayed on the screen.
Write it down and manually edit the cat
control file and add the file name and the
integrity checksum.
/Cfilename : Use the CONTROL file "filename"
to obtain the names of the
files.
The control file is a text based file with
a complete drive, path, and filename. One per
line.
Instead of printing the checksums on the
screen, I'll place them in a text file
called CHKSUM.DAT. If chksum.dat already
exists, I'll append to it.
The entries in Chksum.dat will be PRE-
FORMATTED so you can simply IMPORT
chksum.dat into the cat control file.
eg. Chksum /Cfile.ctl
/SDRIVE : Analyze the drive and build a
chksum.dat file containing the full drive,
path, filename, and the integrity checksum
for all COM, EXE, OVL, and OVR files
on the system. If chksum.dat already
exists, I'll append to it.
This is the QUICKEST method of getting all
the executable files and overlays, ovl and
ovr, added to the cat control file.
You will also need to MANUALLY, using /F,
generate integrity checksums for EVERY file
listed in your CONFIG.SYS.
Osiris SE Technical Reference Manual Page 145
The entries in Chksum.dat will be
PREFORMATTED so you can simply IMPORT
chksum.dat into the cat control file.
You now have one more defense against NEW
viruses.
Synchronizing Access Levels
This means CAT is taking your ACCESS.SYS file and
counting the number of access levels you have
define and matching that number against the number
defined in the SYSINFO.QBS.
I've never heard of this getting out of sync, so
this may be a waste of time, but an ounce of
prevention . . .
Command Line
Cat can accept any one of six command line arguments.
You may NOT intermix the arguments, i.e., only one at a
time.
Cat B
CAT B rebuilds the secondary file indice. It's
used by FAM when you make changes to your FILES.QBS
listings.
You can, if you need to, rebuild the file indice
manually using this switch.
Cat V
CAT V only does the VIRUS Scan and the File
INTEGRITY check, provided you have defined them.
It MIGHT not be a bad idea, if you have a busy
system or you're running on a network, to have a
couple of INTEGRITY events during the day that does
a system wide virus scan and a file Integrity
check.
Cat S
CAT S triggers the FILE AREA file listing sort. You
may need to use this if you have just moved files
and don't want to wait.
Osiris SE Technical Reference Manual Page 146
Cat M
Triggers the Message Area Validation Check. May be
used after you have defined NEW message areas to
build the message databases for those areas.
Cat P
Triggers the Message Area PACK, if an area requires
it. This also triggers the Message Area Validation
CHeck prior to the PACK operation.
Cat ?
Displays a HELP screen listing the available
command line switches.
Cat F
Flush ALL the messages in the CONFERENCE message
areas and reset the callers last read to 0. This
can be used on days you want to BACK-UP the system
and do a full file realignment with a disk
compression program.
Mkpost.exe
<Filename>
Mkpost is a text editor designed specifically for
creating text files suited for BBS display. E.g.,
messages, bulletins, uploading ASCII replies, etc.
Mkpost requires one command line parameter, the
name of the file to save the text in.
E.g., Mkpost rules.txt
Mkpost uses the same editor Sphinx, TNT, and Iedit
uses so you should have no problems using it.
User.exe
Primary Control Boxes And Main Screen
A bank of 19 control boxes is positioned on the right
side of the FIRST display. These are your primary
control boxes to move amongst the user records and to
access the other sub-functions of user.
Osiris SE Technical Reference Manual Page 147
The control boxes are: Flags, Page2, Date, Find, Page3,
Del, Left Arrow, Right Arrow, Page4, UnDel, Index, Exit,
First, Last, Sort, Pack, Add, CDNUP, and Print. To
select one of the control box options, click the LEFT
mouse button. The control boxes may also be selected
using a HOTKEY. To get a list of the HOTKEYS, press
ALT-H.
Flags
Flag opens a Window containing the flag settings; Area
Flags, Command Key Flags, and Misc, for the current user
record.
This window functions the same as the primary window.
To change a field, move your mouse cursor to the line
that the field is on and click the RIGHT mouse button.
You may also select the field to change using one of the
ten F-KEYS. To see which F-KEY is associated with which
field, press ALT-H when the FLAG window is open. The ESC
key also duplicates CLICKing the OK box.
To exit the Flag section back to the primary control
screen, move to the OK box and click the Left Mouse
button or press ESC.
Date
Kill by Date allows you to specify the number of days
that a user hasn't called. If any record matches that,
the record will be flagged as deleted.
This doesn't REMOVE the record, it only mark it so that
it CAN be removed.
Before I start, you will be shown an OK to Proceed box.
Click on YES with the Left Mouse button if you want to
go ahead. If not, move to the NO box and click on it.
Again with the Left Mouse button. LEFT/RIGHT/TAB/RETURN
keys may also be used.
Del
Selecting this option will cause the CURRENT record to
be flagged as deleted. There is no confirmation box and
the record will instantly be marked. It isn't REMOVED,
but only flagged for removal by the PACK option.
Undel
Selecting this option will cause the CURRENT record to
be UNDELETED. You'll be asked for the FIRST character of
the callers NAME.
Osiris SE Technical Reference Manual Page 148
Find
Allows you to search the database based on any one of
three criteria; name, alias, or access level.
You'll be shown (upper right hand corner of the screen)
a small menu. Move to the search option you want and
click with the Left Mouse button. Clicking the RIGHT
mouse button cancels the operation. ESC/ARROW
(UP/DN)/RETURN keys may also be used.
Once the search option has been selected, you'll be
asked for either a search string or an access level.
I'll begin searching at the NEXT record and any matches
will be shown with a YES, NO, or CANCEL confirmation
box. The Left Mouse button indicates that you want the
OUTLINED option to be accepted. ARROW (left/Right) and
RETURN keys may also be used.
The search will continue till either the record is found
or all records have been searched.
If the item can't be found you'll hear a short sharp
beep and then you'll return to the main screen.
Print
Will print a text file, in the current directory,
containing the names, access levels, phone numbers, and
last date on-line for all the user records.
The text file is suitable for printing and has page
breaks using the ASCII 12 Form Feed character.
Osiris SE Technical Reference Manual Page 149
Pack
This function removes ALL records marked as deleted,
rebuilds the two primary index files and then rebuilds
the NEW newmail indices by calling "INDEX.EXE." The
process can be time consuming if you have a LOT of
messages on-line.
Index
Rebuilds all the indices associated with the user
records. Nearly the same as the PACK option, but doesn't
remove deleted records.
Page4
Opens a secondary screen showing the TOTAL uploads and
Downloads for the current record.
This functions just like the primary screen. RIGHT mouse
button to edit a field, Left mouse button in the OK box
to return to primary display screen. You may also select
the field to change using one of the ten F-KEYS. To see
which F-KEY is associated with which field, press ALT-H
when the UP/DN window is open. The ESC key also
duplicates CLICKing the OK box.
Page2
This a second control screen showing additional settings
for the CURRENT user record.
Total Calls, Nodelist Display, Screen Clear Type, IBM
Graphics, ANSI Graphics, Command Type, Help Level,
Conference Mail Check, and Message Posted.
Some fields can be TOGGLED to the reverse settings by
moving to that field and clicking the RIGHT Mouse
Button.
Fields that can be TOGGLED:
Nodelist Display
IBM Graphics
ANSI Graphics
Command Type
Conference Mail Check
The remaining fields can be edited by moving to their
screen line and clicking the RIGHT mouse button. Some
will require TYPING in values while others may use a
pull down menu.
Osiris SE Technical Reference Manual Page 150
When you're done viewing or editing items on Screen Two,
move to the OK box and click the Left Mouse button.
You can also select the field to change using one of the
ten F-KEYS. To see which F-KEY is associated with which
field, press ALT-H when the PAGE2 window is open. The
ESC key also duplicates CLICKing the OK box.
Sort
Allows you to sort the user records using any one of
three sort methods; Access level, Times Called, or
Access Level and Times Called with Access level being
the primary key and Times Called being the secondary
Key.
This sort is for YOUR benefit. Order makes no difference
as far as Osiris finding a record.
Left/Right Arrow
Moves you to the next or previous record.
First / Last
Moves you to the FIRST or LAST record.
Add
Adds a BLANK user record to the user.bbs file. You
should NEVER leave a record blank. If you add a record,
immediately go to the record and edit ALL fields or as
MANY as possible.
Cdnup
This function allows you to mass clear upload and
download fields.
When you select this option, you'll be required to
supply 3 additional pieces of information; Type of
clear, which records to clear, and access levels (if
required).
Type Of Clear
This tells me which fields to clear and you have
three options; upload field, download field, or
upload AND download fields.
Which Records To Clear
Again, you'll have to tell me WHICH records you
want to clear, based on access level.
Osiris SE Technical Reference Manual Page 151
You have three options; All Records, only a
specific access level, or by RANGE.
The only one that needs further explanations is by
RANGE. Range requires a LOW access level and a
HIGH access level and records are cleared only if
the callers access level is equal to or between the
low access level and the high access level.
Page3
Screen Three shows still more settings associated with
the current record.
Protocol, Screen Length, Last File Board, Last Message
Board, Original Log on Date, and Node Restricter.
You may edit any field, except for the protocol field,
by moving to the line the field is on and clicking the
RIGHT mouse button.
When you're done viewing/editing items on Screen Three,
move to the OK box and click the Left Mouse Button.
You can also select the field to change using one of the
ten F-KEYS. To see which F-KEY is associated with which
field, press ALT-H when the PAGE3 window is open. The
ESC key also duplicates CLICKing the OK box.
Dynamic Access Level Changing
You have 3 options.
Shift Up Range.
Shift Dn Range.
Change Specific.
The Shift UP and Shift DN range allows you to specify
an access level RANGE (ie. 4 - 8) and how many access
levels to shift UP or DOWN.
You can specify a range of 1 - 15, shift up, and a
shift of 2. That means anyone with an access level
between and including 1 and 15 will have their access
level boosted by 2. 10 will become 12, 5 will become 7,
etc.
Same thing if you go with the shift dn.
Osiris SE Technical Reference Manual Page 152
Change asks you for the old access level and then a new
access level and just changes anyone with the old level
to the new level.
The Main Display Screen shows 10 primary fields within the
user record. These are the fields that are likely to be
changed the most.
To Edit a field, move to the line the field is on and click
the RIGHT mouse button.
In the lower right hand corner of the screen you'll see a
field containing the CURRENT record number, 0 - 65535.
You may select the field to change using one of the ten F-
KEYS. To see which F-KEY is associated with which field,
press ALT-H.
When editing a field, your mouse buttons may be used to
simulate pressing RETURN, ESC, and CTRL-RETURN.
Left Mouse Button - Simulates RETURN.
Right Mouse Button - Simulates CTRL-RETURN.
Middle Mouse Button - Simulates ESC (clears field)
Access.sys
Access.sys resides in the Osiris root directory and contains
information about each access level you've defined.
You define such things as ; time limits per call, time limits
per day, download limits per day, etc.
Some items, such as time limits and download limits, require
four settings, one for each of the primary baud rates.
This gives you more control, based on just how fast the
caller is, than the traditional single access level for
everyone.
Osetup set up 1 access level for you. You can edit that and
add up to 65534 more access levels. That's in theory.
Osiris SE Technical Reference Manual Page 153
I don't really expect anyone could possible need that many
, given the ability to subdivide each level by 65535.
You can view/edit/add/delete from OSM (Access subsystem).
Time Limit Per Call
One for EACH of the primary baud rates ; 300, 1200,
2400, and 9600. 9600 covers the remaining baud rates.
If a Time Limit Per Call field is set to ZERO, you'll
be given 1440 minutes PER call (basically disabling the
setting). Events will still be ENFORCED.
Time Limit Per Day
One for EACH of the primary baud rates ; 300, 1200,
2400, and 9600. 9600 covers the remaining baud rates.
If a Time Limit Per Day field is set to ZERO, you'll be
given 1440 minutes PER Day (basically disabling
the setting).
Download Limits
One for 300, 1200, 2400, and 9600pbs. Setting this to
ZERO will disable it and gives you unlimited
daily downloads.
File Ratio Limits
One for 300, 1200, 2400, and 9600pbs. Setting this to
ZERO will disable it
This is an X to 1 ratio. Meaning for every X number,
allow 1. If set to 3, the caller would be allowed to
download 3 files for every one uploaded.
Byte Ratio
This allows you to define a KILO-BYTE, 1024 bytes,
ratio.
This is an X to 1 ratio. Meaning for every X Kilo-Bytes,
allow 1 Kilo-Byte. If set to 3, the caller would be
allowed to download 3 kilo-bytes for every one uploaded.
Osiris SE Technical Reference Manual Page 154
Time Give Back
This is the amount of TIME given back for the amount of
time you spent uploading. This is a X to 1 RATIO
meaning give back X minutes for every 1 minute spent
uploading.
3 means give back 3 minutes for every 1 minute
spent uploading.
1 means give back 1 minute for every 1 minute
spent uploading.
0 means don't give ANYTHING.
Byte Give Back
This is the amount of BYTES to give back for bytes
uploaded.
This is a X to 1 KBYTE RATIO meaning give back X Kbytes
for every 1K byte uploaded. 2 would mean give 2K for
every 1K uploaded.
0 means don't give ANYTHING.
Password Protect Uploads
Y or N
This decides *IF* I will ASK you if you would like to
PASSWORD protect the file you're about to upload.
Allow Password/Kill
Y or N
This determines whether or not you're able to flag a
password protected file for auto-deletion.
Attach File To Message
Y or N
This is used by the Message Center to determine IF
you're allowed to ATTACH a file to a message.
Twitting A User
If you set a caller's access level to zero, I'll
assume that person is a TWIT and you don't want him
on-line. I'll display the file "TWIT.ASC/MMU/ANS"
and then hang up on him.
Osiris SE Technical Reference Manual Page 155
Display Files
Unless otherwise stated, all the files that follow may
include ANSI (if .ANS extension).
All the files, unless other wise stated, should be placed in
the TEXT support sub-directory.
Logo.asc/Mmu/Ans
Shown before Osiris ASKS the caller for his or her
first name, per-log on. Contents and make-up is up to
you.
Nodexx.asc/Mmu/Ans
Shown to a caller who has been ASSIGNED to a specific
NODE and has CALLED a node which IS NOT the one he's
assigned to. The 'xx' is the NODE NUMBER he has been
assigned to. Contents and make-up is up to you.
Tlimit.asc/Mmu/Ans
Shown to a caller who has exceeded his DAILY time
limit before Osiris hangs up. Contents and make-up is up
to you.
Xxxx.msg
This is a PERSONAL message addressed specifically TO the
caller with User record number is XXXX. ie. 234.MSG is
for the caller who's user record number is 234. The
XXXX.MSG MUST be placed in the Osiris sub-directory.
The file is in TEXT format, created with any ASCII
editor, and will be shown to the caller it is addressed
TO. Once displayed, Osiris will delete it.
Warning, RENUMBERING the user records (packing) may
cause the record number to change and the WRONG person
will get the message.
NOTE: You should NOT use ANSI in this file nor do SPL/I
commands work.
Accxxxx.bbs
This is a Text message, created with any ASCII editor,
placed in the Osiris directory that'll be shown to
anyone with the access level equal to xxxx.
Osiris SE Technical Reference Manual Page 156
e.g. ACC10.BBS will be shown to those having access
level 10.
I'll NOT delete this file and it will continue to be
shown until YOU delete it.
NOTE: You should NOT use ANSI in this file.
Rookie.asc/Mmu/Ans
This is shown during the log on process, before the new
files check. ROOKIE.ASC/MMU/ANS is shown *IF* the caller
has called your system LESS than 4 times. Contents and
make-up is left up to you.
Welcome.asc/Mmu/Ans
This is the first file shown during the log on process,
providing the caller has called 4 or more times.
Contents and make-up is left up to you.
Welcome2.asc/Mmu/Ans
This file is shown following the welcome.ASC/MMU/ANS or
rookie.ASC/MMU/ANS. Contents and make-up is left up to
you.
Welcome3.asc/Mmu/Ans
This file is shown following the welcome2.ASC/MMU/ANS.
The contents and make is left up to you.
Welcome4.asc/Mmu/Ans
This file is shown following the welcome3.ASC/MMU/ANS.
The contents and make is left up to you.
Welcome5.asc/Mmu/Ans
This file is shown following the welcome4.ASC/MMU/ANS.
The contents and make is left up to you.
Main.asc/Mmu/Ans
This is the menu displayed at the MAIN MENU when you
have FULL help turned on.
Mainhelp.asc/Mmu/Ans
This is the HELP system file for the MAIN menu. This is
shown when you press ? from the main menu.
Osiris SE Technical Reference Manual Page 157
Byebye.asc/Mmu/Ans
This is displayed when you log OFF the system. It's
displayed following the "enter message to sysop prompt."
Byebye2.asc/Mmu/Ans
This is displayed during the log off process right
before you're asked to hang up.
Dos.asc/Mmu/Ans
This is shown to the caller when you SHELL to DOS (F3).
Back.asc/Mmu/Ans
This is shown to the caller when you return from a DOS
shell (F3).
Last_on.asc/Mmu/Ans
This is shown to a caller when you have engaged the
LASTON control file to prevent a back-to-back log-on.
Main1.prg
This is the file shown when you select the MAIN menu
MAIN1 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Main2.prg
This is the file shown when you select the MAIN menu
MAIN2 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Main3.prg
This is the file shown when you select the MAIN menu
MAIN3 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Main4.prg
This is the file shown when you select the MAIN menu
MAIN4 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Osiris SE Technical Reference Manual Page 158
Main5.prg
This is the file shown when you select the MAIN menu
MAIN5 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Main6.prg
This is the file shown when you select the MAIN menu
MAIN6 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Main7.prg
This is the file shown when you select the MAIN menu
MAIN7 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Main8.prg
This is the file shown when you select the MAIN menu
MAIN8 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Main9.prg
This is the file shown when you select the MAIN menu
MAIN9 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Main10.prg
This is the file shown when you select the MAIN menu
MAIN10 option. The contents and make up is left up to
you. Its primary purpose is to allow you to PROGRAM in
your own functions using SPL/I.
Msghelp.asc/Mmu/Ans
This is the HELP menu for the primary Conference area
menu. This is shown when you enter ?. The contents and
make up of this file is left to you.
Gate_m.asc/Mmu/Ans
This is shown when you select the GATE option from the
primary conference area message menu.
Osiris SE Technical Reference Manual Page 159
Editor.asc/Mmu/Ans
This is the LINE editor menu. A default one is included
but you are free to make your own.
Peditor.asc/Mmu/Ans
This is ALSO the line editor menu, but this one is shown
,in place of EDITOR.ASC/MMU/ANS, IF you're allowed to
ATTACH files to messages. Make sure you have BOTH
Peditor and editor.PRG/ans in the text directory.
Edhelp.asc/Mmu/Ans
This is the HELP system file for the line editor. It's
shown when you enter '?' from the Line editor menu.
The contents and make-up of this file is left up to you.
Mchelp.asc/Mmu/Ans
This is the HELP system file for the READ menu, located
in the message Conference system. This file is shown
when you press 'H' for help.
Maskhelp.asc/Mmu/Ans
This is the HELP system file for the MASK sub-menu which
is located in the READ sub-system (message conference
section).
It is shown when you press 'H' for help.
Setboard.asc/Mmu/Ans
This is the menu for the conference selection sub-
system, located in the conference message system.
Confhelp.asc/Mmu/Ans
This is the HELP system file for the conference
selection sub-system. It is shown when you enter '?'.
Filehelp.asc/Mmu/Ans
This is the HELP system file for the main file area menu
options. This file is shown when you enter '?'.
The contents and make up of this file is left up to you.
Osiris SE Technical Reference Manual Page 160
Gate_f.asc/Mmu/Ans
This file is shown when you select the GATE option from
the file area.
File1.asc/Mmu/Ans
This file severs the same function as the
GATE_F.ASC/MMU/ANS file. But, it is considered as a
PLACE holder for future expansion and MAY not be
available for programming in the future.
Search.asc/Mmu/Ans
This is shown when you have FULL help turned on and have
selected the SEARCH option in one of the file areas. It
should explain a little about the search feature.
Ratio.asc/Mmu/Ans
This file is shown when you attempt to DOWNLOAD but your
FILE RATIO is out of whack.
You should explain HOW to correct the problem.
Byte.asc/Mmu/Ans
This file is shown when you attempt to download but your
Kilobyte ratio is out of whack.
You should explain HOW to correct the problem.
Mhelp.asc/Mmu/Ans
This is the SYSTEM help file for the Message Center. It
is displayed when you press 'H'.
Cselect.asc/Mmu/Ans
This is shown RIGHT after a NEW caller has finished
filling out his user record. You may want to use it to
display some ground rules or explain about your system.
Slhelp.asc/Mmu/Ans
Shown to a NEW caller just before he's asked about the
screen length setting. Should explain what a screen
length setting is.
Osiris SE Technical Reference Manual Page 161
Showibm.asc/Mmu/Ans
Shown to a NEW caller just before he's asked about IBM
graphics. Should be used to illustrate IBM graphics.
Showansi.asc/Mmu/Ans
Shown to a NEW caller just before he's asked about ANSI
graphics. Should be used to illustrate ANSI graphics.
No_ansi.asc/Mmu/Ans
Shown to a NEW caller when they are at or below the
required baud rate for ANSI.
Mcmenu.asc/Mmu/Ans
This menu is shown when you enter the Message Center.
Read.asc/Mmu/Ans
This menu is shown when you enter the READ sub-system
from one of the conference areas.
Chelp.asc/Mmu/Ans
This is the HELP system file for the CHANGE menu. Is
displayed when you press '?'.
Phone.asc/Mmu/Ans
This is displayed to NEW callers right before they're
asks for their phone number. It should be used to convey
some type of formatting instructions. The default one,
included with the setup package, uses SPL/I to customize
and force format (on screen).
Onewhelp.asc/Mmu/Ans
This is shown to NEW callers right before they're asked
about OSAGE. It should be used to explain what OSAGE is
and what's required to use it.
Uphelp.asc/Mmu/Ans
This is shown to NEW callers right before they're
asked if they want to be ASKED about the new upload
search. It should explain about the new upload search and
the benefits of using it.
Osiris SE Technical Reference Manual Page 162
Dnhelp.asc/Mmu/Ans
Shown to NEW callers prior to asking about the
Download/Tag prompt during a new upload search.
H_chelp.asc/Mmu/Ans
This is shown to NEW callers right before they're asked
about HOTKEYS or COMMAND STACKING. It should be used to
explain a little bit about each option.
Cslhelp.asc/Mmu/Ans
This is shown to NEW callers right before they're asked
to select the type of screen clear. You should explain
the difference between ANSI, FF(Form Feed) and CR/LF.
Email.asc/Mmu/Ans
This is the HELP system file for the Internode chat
system.
Twit.asc/Mmu/Ans
THis is shown to a caller who has had his or her access
level reduced to ZERO. The name says it all.
Birth.asc/Mmu/Ans
Shown to a caller when the current DATE is his birth
day.
Sys_stat.asc/Mmu/Ans
Shown to a caller during the log on process and from the
main menu (personal status option). Should be used
(programmed with SPL/I) to display some of the caller's
personal stats as well as some of the system stats.
Private.asc/Mmu/Ans
Shown to anyone attempting to LOG on to a NEW system
when that system has been flagged as PRIVATE, no NEW
callers. Should be used to explain that you run a
private system.
New1.asc/Mmu/Ans
This is the FIRST file shown to a NEW caller, right
before the user record information is asked for. You
should AVOID using ANY SPL/I commands in this file.
New2.asc/Mmu/Ans
Shown to NEW callers right after the Cselect.ASC/MMU/ANS
file. Most often used for new caller questionnaires.
Osiris SE Technical Reference Manual Page 163
Fdisplay.asc/Mmu/Ans
Alternate file area display. Most often used when you
have lots of areas, small area names, and want to create
a three or four column display.
Statmenu.asc/Mmu/Ans
The primary statistics system main menu.
Promenu.asc/Mmu/Ans
This is the ON-LINE STORE FULL help main menu.
Prohelp.asc/Mmu/Ans
This is the HELP system file for the On-line Store.
This is displayed when you enter '?' from the main
store menu.
Sintro.asc/Mmu/Ans
This file is shown when you enter the ON-LINE store
sub- system for the first time. It can be used as a
blanket advertising screen.
Slist.asc/Mmu/Ans
Used to display the different STORES you have setup.
This should also display the store NUMBER for each store
listed. The store number corresponds with its position
in the control file.
Infxxxx.asc/Mmu/Ans
This file is shown when the caller selects the
information option from the store menu. It should
contain information about the current store. The 'xxxx'
will be replaced with the store NUMBER.
Bulxxxx.asc/Mmu/Ans
This file is shown when you select the BULLETIN option
from the store menu. It may contain anything and the
'xxxx' will be replaced by the store NUMBER.
Osiris SE Technical Reference Manual Page 164
Files
Files used by or created by Osiris are categorized by
families. The families and types are as follows:
File Type Extension Use
______________________________________________________________
Special Compiled Dual Purpose
display file. display file
that lets the
filtering.
______________________________________________________________
ASCII Display
Files. .ASC NON-ANSI Display
file.
______________________________________________________________
ANSI Display Files .ANS Used for ANSI
Displays.
______________________________________________________________
Osiris Configuration
or Control Files. .QBS
configuration or
Osiris system
related data.
______________________________________________________________
Index .IDX Allows fast access
to system configuration
files. Those with .QBS
, BBS, DAT, and SYS
extensions.
______________________________________________________________
Memo Files .DAT Storage for MEMO
fields.
______________________________________________________________
Index .IDX Allows fast access
to MEMO fields.
Osiris SE Technical Reference Manual Page 165
SPL/I Command Files .PRG Programmable SPL/I
command file.
______________________________________________________________
Individual File Break Down
Callx.dat
Replace x With Node Number
Used to store information about the last caller to
Node x.
Comport.dat
Used to store individual serial port settings,
interrupt numbers, offsets, etc.
Xxxmsg.yyy
Used to store internode email messages. Replace
xxxx with node number. yyy is a random 3 digit HEX
number from 1 to 4096. No two internode email
messages will have the same yyy file extension.
S_node.dat
Holds that NODE status for each node.
Userx.qbs
Replace x With Node Number
The current callers user record, written during
external shells.
Modifications made to this record, during shells,
will be adopted by Osiris when you return from
the shell.
Msgboard.qbs
Contains the individual Conference area settings.
Hdrxxx.sys
Contains the message HEADERS; to, from, subj, etc.
for individual CONFERENCE messages. Replace xxxx
with the conference area number.
Txtxxx.sys
Contains the actual TEXT for individual CONFERENCE
messages. Replace xxxx with the conference area
number.
Osiris SE Technical Reference Manual Page 166
Hdp.sys
Contains the message HEADERS; to, from, subj, etc.
for private Message Center messages.
Txtp.sys
Contains the actual TEXT for individual Message
Center messages.
Msgx.doc
Replace x With Node Number
A temporary holding file for message text. File is
created and deleted by Osiris when needed.
Newmail.sys
A new, personal, conference mail index file. Used
for fast new personal mail checks.
Pmail.idx
A new, personal, PRIVATE Message Center new mail
index file.
Hdh.sys
A temporary holding file for message HEADERS; to,
from, subj, etc. for all areas marked as REV.
Txtp.sys
A temporary holding file for message TEXT for all
areas marked as REV.
User.bbs
Used to store individual user records.
User.idx
Index for fast access to user.bbs, key is user
name.
Alias.idx
Index for fast access to user.bbs, key is ALIAS
name.
Osiris SE Technical Reference Manual Page 167
Filboard.qbs
Used to store settings for each individual file
area.
Files.dat
A secondary data file used for fast access to the
files available for downloading. This index is used
by the new uploads search, string search, and other
operations where speed is paramount.
Files.idx
Index used, under some conditions, for fast access
to FILES.DAT.
Dl_area.idx
Index used, under some conditions, for fast access
to FILES.DAT.
Upx.bbs
Replace x with Node Number
Used to store the names and sizes of the files
uploaded during the CURRENT day.
File is used by CAT when it posts the daily
statistics message to the sysop.
Dnx.bbs
Replace x with Node Number
Used to store the names and sizes of the files
dnloaded during the CURRENT day.
File is used by CAT when it posts the daily
statistics message to the sysop.
Ncx.bbs
Replace x With Node Number
Used to store the names of NEW callers during the
CURRENT day.
File is used by CAT when it posts the daily
statistics message to the sysop.
Badfiles.bbs
Used to store the names of ILLEGAL file names you
do not want used on your system.
Osiris SE Technical Reference Manual Page 168
Sendx.ctl
Replace x With Node Number
Temporary file created by Osiris to hold the full
drive, path, and names of the files the protocol is
suppose to send to the caller.
If you tell me to, I will pass this file name to
the protocol driver.
The File format is a single filename per line, no
limit on the number of lines.
Tranx.log
Replace x With Node Number
A temporary file created by the protocol driver
listing the name(s) of the files sent to the
caller.
I'll use this file, providing it exists, to
determine which files to charge the caller for
downloading.
If this file does not exist, I will have to rely on
the protocols exit errorlevel.
File Format is a single file name per line, no
limit on the number of lines.
E.g.,
SE302A.ARJ
TMOD710.ARJ
ZMODEM.ARJ
Do NOT include drives or paths.
This is an illegal entry: C:\SEND\SE302A.ARJ
It should have been: SE302A.ARJ
Effx.log
Replace x With Node Number
A temporary file created by the protocol driver
holding a single short integer. This should be the
average thoughput rating, percentage, for all the
files sent during the file transfer session.
Osiris SE Technical Reference Manual Page 169
This does not hold the average CPS rate, only the
percentage of effective thoughput.
E.g., 97
Transfer was 97 percent.
Protocol.cfg
Used to store protocol definition records.
Default.msg
Used to store the default messages areas for new
callers.
Osiris.err
Used to store information about CRITICAL errors
that prevented Osiris from running.
Welcome.bbs
The contains the text for the MESSAGE sent to new,
first time, callers.
Proboard.qbs
Used by the Store System and holds information
about the location of the store database files.
Hpdxxxx.dat
Replace xxxx With Department Number
Holds the HEADER information about the products for
department xxxxx.
Tpdxxxxx.dat
Replace xxxxx With Department Number
Holds the descriptions for the products in
department xxxxxx.
Mainpriv.qbs
Holds the keys, access levels, and flag settings
for the main menu.
Osiris SE Technical Reference Manual Page 170
Access.sys
Holds the information pertaining to the access
levels you have defined on the system.
NOTE: Record #0 is a place holding record and isn't
used for access level information.
Sysinfo.qbs
Used to hold some information about your system
configuration.
This file will, is, gradually being phased out and
information stored in this file is slowly being
moved to the individual NODEx.CFG files.
Laston
Contains information used by the LASTON function.
Callx.cnt
Replace x With Node Number
Contains the total number of BBS callers node x has
received.
This is a single 4 byte long integer.
Nodex
Replace x With Node Number
A temporary file listing the name and city of the
caller currently on node x.
If the name begins with 01H, the caller is not
suppose to show up as being "ON-LINE."
Bulletin.hdr
Used to store the SYSTEM bulletin headers.
Bulletin.txt
Used to store the text bodies of the system
bulletins.
Mod.ctl
The area moderator passwords and area numbers are
stored in this file.
Osiris SE Technical Reference Manual Page 171
Baud.dat
Contains information about the TYPES of connects
i.e., baud rates.
Dorinfox.def
Replace x With Node Number
I'll write this file, a popular DOOR control file,
when you issue the DORINFx.DEF SPL/I command.
You are limited to nodes 1 - 9.
Door.sys
I'll write this file, a popular DOOR control file,
when you issue the DOOR.SYS SPL/I command.
Unlike DORINFOx.DEF, Door.sys does NOT support
multiple nodes.
Sig.def
Contains the individual SIG definition records.
Sigx.log
Replace x With SIG Number
Contains a log of the internode chat messages for a
specific SIG.
Chat.dmp
Contains screen snapshots created during SYSOP
chat.
Tcallx.bbs
Replace x With Node Number
Used to store the number of calls node x has
received for the CURRENT day. This is used by CAT
when it posts the statistics message the sysop.
Osiris SE Technical Reference Manual Page 172
Histx.log
Replace x With Node Number
Used to stores the caller history for node x.
Outx.qbs
Replace x With Node Number
DOOR information file written during shells.
Myyxxxx.txt
A temporary file used to store messages packed by
the pack function. Replace yy with the node number,
2 digit hex format. XXXX should be replaced by a 4
digit hex number for the area being packed. If all
areas, use zero for the area number.
Key.def
Contains the ASCII keys allowed during input
operations.
Cmds.dat
Contains the display text, colors, and
formatting characters for the text prompts
within the main Osiris program.
Cmds.key
Contains the command keys for varies prompts like
Yes/No. Used in conjunction with Cmds.dat to tailor
the system to other languages.
Nodex.cfg
Replace x With Node Number
Contains system configuration information for node
x.
Miscellaneous Items
Now we will talk about this and that. Items not directly
related to each other or the primary operating sub-systems of
Osiris, except for SPL/I.
I'll leave SPL/I till the very last. It's by far the most
complex system in Osiris and the one NEW sysops aren't likely
to need right away.
Osiris SE Technical Reference Manual Page 173
Ansi.sys
Osiris uses its own built in high speed ANSI emulator that
writes directly to the Video port. This accounts for a VAST
increase in speed over the traditional ANSI.SYS drivers.
What About Security?
After reviewing the documentation, you will undoubtedly begin
to think that I'm preoccupied with security. If so, you're
absolutely right. Although Osiris is perfectly capable of
serving the needs of the hobbyist, it was designed with a
business environment in mind, an environment in which the
integrity of information is of paramount importance. Osiris
security is second to none. Since the first version of
Osiris was released, the security provisions have never been
overcome as the result of a software deficiency or compromise
of the program code.
That was a boastful statement and up till a couple of weeks
ago (summer of 1991), accurate to the best of my knowledge.
However, that suddenly changed.
When I got back from a recent trip, I'd received a disturbing
letter from an Osiris sysop in South America. He thought he'd
discovered a method of breaking into Osiris remotely.
Actually his wife came up with it while he was trying to
explain about the BBS one night. She asked "what happens
IF." I hate that question, don't you?
After reading his letter, I thought about it for a few
minutes and just shrugged it off, wouldn't work. But during
lunch it kept nagging at me, so when I got back I decided
to try it.
The first attempt failed and I almost gave up but decided I'd
give it one more try. This time it worked. I had seized
control of the computer remotely and could do anything I
wanted.
To say I was feeling pretty stupid would be an
understatement. Here I'd gone and left a doorway big enough
park a garbage truck in.
By this time I was calling the method B&S, after the way I
felt. After I explained what was happening to my girl friend,
she said something to the effect of "Chronic PMS for
Sysop's" . . . I had to agree with that so the name stuck.
Osiris SE Technical Reference Manual Page 174
I got to wondering if it was possible that other BBS programs
were also open to PMS attack. It was or seem to be totally
BBS independent. And I had heard of several QuickBBS systems
over the pass year that had a lot of trouble so I began to
look into it.
I selected WildCat, Pcboard, QuickBBS, and RemoteAccess as
the BBS programs I would test, since I had access to those
systems locally.
After a series of tests, I can report that ALL FOUR BBS
programs were taken over using PMS within a matter of
minutes. In fact, RemoteAccess fried the network it was
running on.
Although I haven't the time nor the desire to do the actual
testing, I'm sure almost ANY BBS program is ALSO open to PMS
attack.
Since I started with this, I can account for 9 instances of
PMS attack around the country, mostly QuickBBS systems.
QuickBBS' sysops must piss a lot of people off. I'm sure
they, the person doing the attacking, calls it something
other than PMS, but it's the same method.
Am I going to tell you HOW to use PMS to break into a system,
no. I was going to make the information available to
registered Osiris sysops, but Willy (shyster in the pin
stripped suit) said to keep my mouth shut about the
particulars so I will.
But I can tell you how to protect your system. Yes there is a
way, providing the software KNOWS what PMS is.
Step 1: Get Osiris v3.00 or greater. Earlier versions know
nothing about PMS. Version 3.00+ has internal anti-PMS
screens.
Step 2: Use ONLY my protocol drivers, excluding Zmax. It has
no anti-PMS screens, yet. Use /V on the protocol command
lines.
Step 3: Allow ONLY those people you have VERIFIED access to
external applications that deal with the serial port. This
includes Games, special file transfer protocols.
This is very important. I can ONLY protect you as LONG as I'm
in complete control of the serial port and computer. The
minute you run Tradwars 2002, Puma, Bi-Modem, etc. I have to
give up that serial port and you have to give PMS protection.
Luckily, most people that call your system will not be
interested in doing any harm. They just want to enjoy it.
Osiris SE Technical Reference Manual Page 175
But there is a small, but growing, number of people that get
off on crashing systems. Don't be one of those they NAILED
because you were not prepared.
Avs(tm)
In the early part of 1991 International TeleCommunications
started tracking the development of a strain of computer
virus known as "Polymophic".
The Polymophic virus uses a mutating engine, hence the name
polymophic, to generate a different version of itself every
time it infects a new file.
Because all occurrences of the virus are different, finding a
signatures of any two instances of this virus is highly
improbable. All this boils down to; normal methods of
detecting the virus are totally useless.
It is estimated that the earlier versions of the mutating
engine can produce some 4 billion different forms and there
are already improved mutating engines being developed as you
read this.
In an attempt to safe guard our customers, we installed an
ANTI-POLYMOPHIC system, AVS(tm), in Osiris.
Even though CAT is capable of detecting a POLYMOPHIC virus,
any virus for that matter, the SOONER it is detected, the
less damage it can do.
AVS(tm), Anti viral shield, is an integrated part of the
Osiris.exe program and uses a triple level protection system
to detect any changes in itself that may be caused by a
virus.
When Osiris first comes on-line, it will do a QUICK check
that takes roughly 1/10th of a second. The QUICK check is
capable of detecting most virus infections. If it detects
anything, it will drop carrier, delete itself (to keep from
spreading the virus), and it will display this message:
You have an ACTIVE VIRUS on your computer!
When the caller hangs up Osiris will engage the two detailed
AVS sub-systems for a much more detailed analyses. It is
almost impossible (one never says TOTALLY impossible when
dealing with a computer) for anything to escape the detailed
analyses. These tests take between one and two seconds to
complete.
Osiris SE Technical Reference Manual Page 176
Again, if anything is detected, Osiris will drop DTR (to
prevent the modem from answering), delete itself (to prevent
the spread of the virus), and finally it will display the
message
You have an ACTIVE VIRUS on your computer!
What To Do?
If AVS, or CAT, does detect something, run SCAN.EXE
to see if it can determine what virus has infected
your system. If it can identify the virus, follow
the guidelines SCAN provides for CLEANING the infection
from the system.
If SCAN can't figure it out rename one of the infected
file to "VIRUS.TXT," place it in an archive, and send
it to us so it can be analyzed.
Memory Manager
Osiris SE has an internal Virtual Memory Manager (Referenced
simply as VMS) that assures the maximum amount of free memory
is available for all external applications such as protocol
drivers, SPL/I _EXECUTE calls, archive calls, etc.
VMS will use either your DISK or EMS memory to store mapped
Memory Segments before making these calls.
If All memory is made available, VMS will reserve 6K of
conventional memory for itself.
Usually VMS can regain control of any locked computer during
protocol shells and SPL/I execute calls. If you need to dump
the program you've called because it locked up or you just
want to, press Ctrl-Alt Ins. VMS will kick the program out of
memory and reinstall Osiris.
Osiris SE Technical Reference Manual Page 177
Vms Errors And Their Meanings
Too Many Open Files
This error occurs when VMS tries to open the temp.
file and all available file handles are already in
use. The solution is to increase the FILES=
statement in config.sys.
Access Denied
Means that the root directory for the temp. file
is already full. This is probably a good time
to consider a little disk management.
Cannot Locate Comspec
This error means VMS could not locate the command
processor using the COMSPEC environment variable.
The COMSPEC variable MUST give the name and
location of the command interpreter. Generally,
you should not hit this error, because if
COMSPEC is not set properly you will almost
always get a lockup after running any program.
QuickBasic and Bordland Turbo Pascal programs
have been known to damage the environment and
cause the above problem.
Memory Control Blocks Are Damaged
This means that memory that belongs to Osiris
has been overwritten, QuickBasic programs are
bad about this and so are some TP programs that
use overlays. If I can't follow the chain of
memory blocks to determine how memory is
structured . . . This is only possible if you free
only PART of the memory instead of all of it.
Not Enough Disk Space
This error means there is not enough free space
to store the TEMP. file. I'll check the disk
space BEFORE attempting to create the file so I
don't waste time if there is not enough space.
Error Writing The File
This should NOT occur since I insure there is
enough space for the file before writing it.
However, if you get this error, it means that DOS
returned an error while the file was being written
to disk.
Osiris SE Technical Reference Manual Page 178
Too Many File Handles
This means that there is more than 255 file
handles in the extended file handle table. VMS
can handle upto 255 MAXIMUM. Out of curiosity,
how did you get DOS to allow more?
Interrupt(s) Changed During A Shell
This error should never happen. VMS will save (and
restore) any interrupt that falls in the area of
memory that's to be freed. Interrupt 14H is always
saved and restored even if it is NOT in the area
of memory to be freed.
The only time I can see the above happening is
when you use one of the command line switches to
reduce the amount of free memory requested and an
interrupt lies outside of the area to be freed.
Too May Mcbs
This error means there are more MCBs than I deal
with. I can handle up to 80 which should be MORE
than enough for 99.9 percent of the programs.
Not Enough Memory To Load The Command Interpreter
This means there was not enough memory for the
command interpreter to be loaded in memory to call
the child program. The work around is to specify
that MORE memory is required for the child
program.
To load COMMAND.COM, you generally need to have at
least 32K free, and I suggest at least 64K.
The above list isn't ALL the possible errors.
There are others, but the likely hood of your
system locking up if they occur is so high . . .
Locked Dte
If you're running a LOCKED DTE, locking the serial port at a
fixed baud rate, you have to use an environment variable to
define your fixed DTE rate. This variable is COMx with x
being the com port to use.
e.g. SET COM1=19200, SET COM2=9600
Osiris supports fixed DTE rates up to and including 115,200
baud.
Osiris SE Technical Reference Manual Page 179
Keyboard Commands
For list, press F1 while on-line in local mode. Sysop Help
screen will pop open.
Confirming Sysops Intentions
When you press one of the sysop command keys, F1 though
F10, you will be asked to confirm your intentions by
pressing 'Y'. I'll give you no more than 3 seconds to
press 'Y' before aborting the sysop command.
I've done this for two reasons. First, a lot of
businesses run Osiris systems and a lot of them use
electronic air cleaners. That's good, it keeps the
air clean, but it also fills it with static
electricity. A computer keyboard is one of the first
thing effected by static electricity. Stray characters
have been known to creep into the picture every time
one of those cleaners POP.
The confirmation process will keep one of those STATIC
pops from accidentally kicking a caller into CHAT
mode, hanging up, and giving him twit access, etc.
The second reason is young kids. Computers draw them
like a magnet and this will keep them from
accidentally knocking someone off-line, hanging the
computer, dropping access levels, etc.
Node Restricter
If you'll run the user.exe, you'll find a field
called node Restricter. If you enter anything in this
field other than zero, I will force that caller to use
only that node.
If he attempts to log on to any other node, the text file
nodeX.asc/mmu/ans, X being the value in the user
records node Restricter, will be shown. It should contain
something to the effect that he's been assigned to
node so-and-so and must call that number.
After the files been displayed, I'll hang-up.
There are several conditions where this can come in handy.
Assuming you have a two line system and one line has a HST
9600 baud modem on it and the other has a 2400 baud modem.
To maximize the HST, you may want to restrict that line to
only 9600+ callers and have the slower baud rates use the 2nd
line or node 2.
Osiris SE Technical Reference Manual Page 180
If you want to assign individuals to MULTIPLE nodes then
you'll need to use SPL/I. You can get very complex in
your assignments with it.
Command Stacking
Osiris has one of the most advanced command-stacking systems
you're likely to encounter. To stack commands in Osiris,
place at least ONE blank space between commands.
Commands may be stacked ANY place, even at Y/N prompts. As
many as 40 commands may be stacked in most places.
Command Stacking Example
Assume you have suddenly decided that you need to log
off at the "[N]ext [R]eply [Q]uit ?" " prompt. This
can be done by stacking the commands 'Q G N' which will
abort the "Next msg" prompt and then proceed to log
you off the system.
NOTE: The above prompt doesn't really exist but was used
as an example.
Special Stacking Characters
There are TWO special characters reserved by
Osiris when dealing with command line stacking, a semi-
colon (;) and a colon (:). The semi-colon is
translated into a Carriage Return <Enter> and the
Colon is translated into a <Ctrl-K>.
NOTE: The only place command stacking
will not work is jumping into a
CUSTOMIZED command from another area that
doesn't normally exist.
e.g. You've added a customized command to
the message areas that lists all system
callers and the command key is ! to
access this option. Caller is in File
Areas and does a M M !.
He will go to the main menu, then to the
message areas, but will get stopped
because "!" doesn't normally exist.
Osiris SE Technical Reference Manual Page 181
Hotkeys
Osiris allows you to switch to HOTKEYS instead of using
advanced Command Stacking.
You should make your users aware that they can never get the
display screen to instant stop and switch.
This isn't because the HOTKEY setup isn't good. It's because
of the much faster screen displays. Most of the time the
screen's already out the com port or at least sitting in the
modems transmit buffer by the time the caller sees the first
character. Once it has gone this far there isn't anything you
can do to stop it.
Birthdate
Osiris does require the caller to enter his or her birthdate
and I'll use it as a secondary security check every 6th
call.
You'll be required to RE-ENTER the birthdate and if it is not
correct, I'll notify you and then hang up on the caller.
If I do hang up because you couldn't enter the correct birth
date, I will NOT update the TIMES called field. You'll
CONTINUE to get the secondary security check until you DO
enter it correctly.
I also check the birthdate against the CURRENT date and if
the month and day match, callers birthday, the file
"BIRTH.MMU/ASC/ANS" will be shown. You can wish him a happy
birth day with this file.
Caller's Telephone Number
New callers must enter their home phone number when filling
their user record. You will need to build a create text
file called "PHONE.ASC/MMU/ANS" ( or use the default
file created during the set up) that will display the
prompt asking for the phone number. It is suggested that
you display some type of required phone number formatting
information.
Example
Enter HOME phone number using one of the following
formats:
United States, Non Local caller: xxx xxx-xxxx
Trans-Atlantic : xx xxx-xxxx
Local Caller (Not a LD call) : xxx-xxxx
>
Osiris SE Technical Reference Manual Page 182
Notice that a ">" was entered as the VERY LAST ITEM in
the file. A carriage return was not used after it.
That will place the cursor directly after the ">"
making it look neater. I'll not FORCE any of the
above formats, but I will require you to enter a
minimum of 8 characters.
I'll strip out all non-numeric characters and do a search on
the existing user records for a matching phone number, if the
search is allowed.
Some BBS programs have fancy (xxx) xxx-XXXX formatting.
Osiris doesn't do this because not all countries use the same
type of phone number format that we do in the United States.
You can built a custom SPL/I command file to ADD it. There is
one in the SPL/I 4.00 source file directory on Vetlink III
that can be used in the United States.
Some BBS programs, WildCat for instances, use the phone
number as a security check.
Not only is this pretty poor security, it's down right silly.
If I know your name, just how much trouble is it to open the
phone book and get your phone number?
Screen Length
I'll allow screen length settings from 6 (lap tops) to 50
(VGA).
Passwords
A MAJOR problem in many areas is callers using the same
password on multiple systems. Let someone get that password,
and they've access to any system that person calls.
It's understandable why people use the same password on
multiple systems. It's easy to remember and coming up with
unique password can be difficult.
To avoid this problem, I'll only allow you to select the
FIRST character of the password. I will randomly generate the
remaining 4 characters for a total of 5 characters.
NOTE: You may override this (nodeX.INI)
and allow the caller to select his or her
entire password
Osiris SE Technical Reference Manual Page 183
Changing Passwords
Many corporations require their personnel to change
passwords on a weekly bases, to avoid the possibilities
of someone "HACKING" it.
I will, at the change menu, allow the caller to
REGENERATE a new password at any time.
Rotating Passwords
If you do have to periodically change your password, you
can have Osiris track the time for you.
You determine the number of calls that each password is
good for and when that limit is reached, I'll
automatically prompt for or generate a new password.
Alias
An ALIAS is a secondary name you might want to use, in
messages, in place of your real name.
There are several reasons to use an Alias (professional
people may not wish to be bothered with giving out free
advice).
When a new caller fills out his or her user record
, there is a field provided so they may enter an ALIAS name.
All Alias names MUST be unique.
The personal newmail check and the conference newmail check
can locate mail to the caller if the mail is addressed to
their real name or their alias name.
You do, of course, have control over whether or not an ALIAS
may be used in ANY conference area.
Private Listing
You're given the option of having your name withheld from the
user list display. This goes along with the ALIAS names to
offer some degree of privacy.
When a user list display is requested and I come across any
caller not wishing to have his or her name display, "Private
Listing" is used in place of the name and "XXXXXXXXXXXXXXX"
is used in place of the city. Your caller list will NOT be
blank under any conditions.
Those having the privacy switch turned on will not be listed
as last caller to the system and will not be able to receive
CB inter-node Email.
Osiris SE Technical Reference Manual Page 184
If they upload any files, only the you will SEE their name.
Other callers will see N/A as the name of the uploader.
Accounting System
After you have entered your password your current credit
level will be shown, providing the time billing system is
active.
The accounting system settings can be found in the NodeX.INI
file.
There has been some confusion on just how this system works,
although it is fairly straight forward.
Your time on-line is tracked and when you hang up, I take the
number of minutes spent ON-LINE and divides it by the PER
MINUTE OF CONNECT TIME and multiple THAT by the PENNIES PER
MINUTE variable. That amount is deducted from your MATRIX
CREDIT FIELD.
Message Conference Check
I'll run a Message Conference verification check on areas
you have selected, each time you log on to the system.
I'll take each area selected and verify the area is STILL
accessible. If the area has been removed or the access
level to that area has been changed and your access level
isn't high enough, I'll remove the area from your list.
A message similar to the following will be placed in the
log if I remove any areas.
Area #2 not accessible.
Stats Screen
Following the conference verification check, I'll show a
file called "sys_stat.ASC/MMU/ANS," providing it exists.
NOTE: Most sysops use this file to show
personal statistics as well as system
statistics using SPL/I.
Personal Mail Check, Message Center
Then A NEW personal mail check is done. If you have personal
mail waiting, the message will be displayed and you have the
option of replying. This is NOT optional.
Osiris SE Technical Reference Manual Page 185
Conference New Mail Check
This is a Conference Area New mail scan to see if there is
any NEW mail addressed to you. If so, the message header is
displayed and you have the option of reading it, skipping it,
or quitting.
The newmail check is very fast and can scan the index file at
the rate of about 15000 messages per second.
Following the scan for PERSONAL new conference mail, each
conference area having NEW messages will be displayed.
Searching For New Files
After the string of welcome files (welcome, welcome2,
welcome3, welcome4, and welcome5) , you're given the option
of searching for NEW files, if you have this turned on.
The secondary index FILES.DAT is search, instead of the
PHYSICAL file area to reduce the load on the hard drive, for
any new files uploaded to the system since the specified
date.
If one is found, the file name along with the file
description is shown.
IF you have access to the Download Command for that area
and provided you have this prompt active, you'll be asked if
you'd like to download or TAG the file for BATCH downloading.
This should make getting NEW files much easier since you
don't have to remember filenames or directories.
Logging The Search Date
After the search has been completed, you'll have the
option of LOGGING the search date, Yes or No.
If you log-on and there is an external event or you
simply don't have time to download, for whatever reason,
you can answer No to the log prompt and the next time
you call, the same date will be used for the new uploads
search.
Osiris SE Technical Reference Manual Page 186
Hard Drive Maintenance
If you were running some other BBS system, you are
probably optimizing your hard drive at *least* every other
day. With Osiris, you probably won't need to optimize it
for over a month and the hard drive access time will
probably appear as smooth as it was the day you installed
Osiris. With one big message file per area, almost
invariably laid out in a contiguous set of sectors on a
SeaGate S251, the head makes one smooth sweep from one end
to the other with so few movements that the little red
indicator light barely blinks at all. Not only is
message access time faster using Osiris message base
technology, but your hard drive should fare better
for wear and tear.
Error Handling
If I detect any type of file handling error when attempting
to open, read, write, seek to a new position, or create a
new file, I'll open the "Osiris.ERR" log file and post the
error number along with the date and time the error happened
and the name of file.
I'll also write it to the screen in case something is
seriously wrong and I can't use the Osiris.ERR log.
I'll notify the caller that a System Error has occurred,
apologize for the problem, and then dump the caller by
dropping DTR. I'll then exit back to DOS with an error
level of 101.
This errorlevel should be trapped and the mailer should NOT
be brought back up. This will leave things in the state
they were in when the error occurred so the problem
may be found and corrected.
The General Error Routine just logs things like missing
sysinfo, not baud rates, fossils, etc.
Sample Osiris.err
Error L1000: 'No baud rate specified!'
Error L1000: 'No port number specified!'
Error L1000: 'Sysinfo missing'
Error F2002: 'access.sys'
Error L1000: 'No access level information!'
To understand the meaning of the F20XX error number, use
the following table, making note of the last two digits.
NOTE: These are NOT internal errors, they are DOS error
messages. I'll intercept the error messages and Osiris will
do the DISPLAY to prevent DOS from HALTING the program.
Osiris SE Technical Reference Manual Page 187
F20xx Error Codes
F2001 Invalid DOS function number requested.
F2002 Specified file not found
F2003 Specified path not found
F2004 too many open files
F2005 Access to file denied
F2006 Specified handle is invalid
F2007 Memory control block was destroyed
F2008 Not enough memory for request
F2009 Invalid memory block address specified
F2010 Environment invalid
F2011 Invalid format
F2012 Invalid file access code
F2013 Invalid data
F2015 Drive is not valid
F2099 Gdosint error
Warning Messages
Some possible WARNING messages that might appear in your
Osiris log:
Lm1001
You had an area selected that no longer exists ,it
might have been deleted or the access level was
changed and your access level is not high enough.
I've detected it and removed the area from your list.
Lm1002
For some reason, the total number of message areas
selected shows greater than 50. I've detected this and
corrected it by lowering it to the maximum
allowed.
Check your DEFAULT.MSG file and make sure you do NOT
have more than 49 areas define. The following three
error messages should NEVER appear.
Files were left open in one of the sub-systems and
when the caller switched system, Osiris detected it.
Error Xxxx9000
They will more than likely never be seen. If they do
appear, it will probably be right after a MAJOR code change.
ERROR MAIN9000, Contact International TeleCommunications
ERROR FILE9000, Contact International TeleCommunications
ERROR MSG9000, Contact International TeleCommunications
Osiris SE Technical Reference Manual Page 188
Ansi Esc Filter
Osiris has an ANSI <Esc> (ASCII 27) filter on the File area
Type command, the archive Contents Command and on all Read
Message displays.
Prevent someone from uploading a file that contains ANSI
sequences that could reprogram your keyboard (to format
your hard drive or to do just about anything else they
wished).
Slash Commands
One of the problems I've run into is wanting to add more
custom commands or sub-systems to my system than available
slots on the primary menu(s). I want them available FROM the
menu without having to resort to SUB-MENUS.
This isn't too big of a problem at the main menu because
you have 10 SPL/I mainxx.PRG files to play with, but even
that number is rapidly becoming to few. The public
conference areas and file areas only have 1 such file
available, far to few for me.
You can't alter the file board (filboard.qbs), message
board (msgboard.qbs), etc. without making every secondary
program obsolete.
That's where the Slash commands come into the picture.
A Slash command is executed when you pressing the
forward slash key, /.
You can use up to 8 characters for the command.
The slash command can be entered in any one of the
three primary systems; main, public Conference areas, and
the file areas.
The command following the / is not really a command, it is a
FILE NAME.
NOTE: The '/' is NOT part of the file
name and does NOT count towards the 8
character limit. The slash, /, is
SYMBOLIC and is used simply to SHOW that
a SLASH command is being executed.
IF that file exists, it will be shown and any/all
SPL/I commands can be used.
The file for the slash command can reside in any one of TWO
places.
Osiris SE Technical Reference Manual Page 189
If you enter a slash command from the main menu, I'll look
for the file in a subdirectory OFF the TEXT directory.
Remembering that the TEXT directory is where your
ASC/MMU/ANS files are.
Assuming that your TEXT directory is C:\OSIRIS\TEXT and you
enter /GAMES at the main menu then I'll attempt to show the
file C:\OSIRIS\TEXT\MAIN\GAMES.PRG
You'll notice that GAMES.PRG was expected to be in the
directory C:\OSIRIS\TEXT\MAIN
IF it wasn't there, then I'll look for the file
C:\OSIRIS\TEXT\GAMES.PRG
This lets you RESTRICT a slash command to a particular
menu or make it system wide by placing it in your TEXT
directory.
Each area has its own specific sub-directory that I'll
look in FIRST.
File Areas : Sub Directory FILE
Public Conference areas : Sub-Directory MSG
Main Menu : Sub-Directory MAIN
Taking the above example but assuming you selected the slash
command from each of the above area and assuming that your
TEXT directory is C:\OSIRIS\TEXT AND you enter /GAMES.
File Area : C:\OSIRIS\TEXT\FILE\GAMES.PRG
Public Conference Area : C:\OSIRIS\TEXT\MSG\GAMES.PRG
Main Menu : C:\OSIRIS\TEXT\MAIN\GAMES.PRG
Failing to FIND the file in their respective directories,
meaning that the command MAY be a system wide command,
C:\OSIRIS\TEXT\GAMES.PRG
This allows you to add literally MILLIONS of custom commands
without having to ADD, CHANGE, or ALTER the structures of ANY
Sub-System in Osiris.
If you enter / and nothing else or /? then I'll try to show
the file SLASH.PRG. I'd suggest you use this as a HELP file
to list your slash commands.
Restrictions
A SLASH command CAN be command stacked but does have
some restrictions. For instances, if you're in the FILE
AREA and do a "M /GAMES" and you're expecting to go to
the Main menu and execute the slash command GAMES then
you'll find that's NOT the case.
Osiris SE Technical Reference Manual Page 190
The PROPER way to STACK a slash command is to STACK it
as TWO separate commands, / GAMES, because it IS two
different commands. / ACTIVATES slash system and GAMES
being the slash systems COMMAND.
You can't HOTKEY into a SLASH command. In other words,
entering a / while a menu is being display will
have NO effect and will be ignored.
Illegal Names
I'll not allow you to use any SLASH command that starts
with the following.
COM
CON
PRN
AUX
LPT
This prevents you from entering COM1 or AUX which would
LOCK up the system.
Last On
If you have a busy system, you can stop the same caller
from logging back on-line until someone else has had a
chance to log-on.
To engage this option, create a file in your osiris
directory called "laston."
The file "laston" contains two fields, elapse time and access
level.
e.g.
Copy Con Laston<CR>
10 20^Z
Field one, elapse time, is the amount of time the system
stands idle, no callers. If no calls are received in the time
specified then the caller may log back on.
Field two is the access level that allows callers to
bypass the laston feature. Used to allow co-sysops, area
moderators, paying customers, etc. to log-on back-to-back.
The time compensation system for uploads will also not
increase the time for the CURRENT call on uploads. The time
will be "banked" and can be used later that day.
Osiris SE Technical Reference Manual Page 191
If this option is active and the same caller attempts to log
back on, I'll show, if it exists, the text file called
"last_on.mmu/asc/ans." You can briefly explain that you
don't allow back-to-back log-on and ask the caller to
kindly wait till someone else has had a chance to call or
until the in-activity time, field one, has elapsed.
Mailer Combinations
I've tested Osiris with SEADOG, FRONTDOOR, DUTCHIE, ISIS,
TELCOM and BINKLEY. No problems have cropped up with any
of these mailers.
Commit Dos Function
Later versions of DOS (3.30 and later) have an extended
File Flush Function that offers a secure method of flushing
file buffer before closing a file. If I detect DOS 3.3
(or a later version), I'll enable the extended flush
function and call it before closing any file.
File Handles
If I detect DOS 3.30, or later versions, I'll extend the
internal file handle table to allow Osiris to have up to 40
files open at one time. This is a safety feature and
Osiris doesn't require that many. It is possible that I may
fail to close a file. This isn't likely, but it does give
me a little safety margin.
Color Optimizer
Osiris has a color optimizer built into the MMU color display
system that can reduce the number of characters to the screen
and com port by 38 to 40 percent, depending on colors used.
COMPILED MMU files will be optimized, RAW ANSI will be
displayed AS IS without being optimized or altered in any
way.
Most, if not ALL, the internal colors within Osiris will
go thou the color optimizer.
Callers should see the "Jerky" movement (at 12/2400 baud)
associated with color changes all but disappear.
Osiris SE Technical Reference Manual Page 192
Osiris And Multiple Nodes
As indicated in the Software License Agreement, any multi-
line version of Osiris must be used "on multiple computers
that are connected by direct cable to the same network
server." It is not licensed for use at multiple locations.
Any questions regarding your rights under the Software
License Agreement should be directed to me for clarification.
Overview
Those installing the multi-line version for the first
time, as well as those upgrading from a single-line
version, should first set up a single line system. Don't
attempt to setup multiple lines right off the bat.
How It Works
When writing a multi-line BBS system there are two ways
of talking to more than one communication port at the
same time.
The first makes use of "internal program multi-tasking."
A single PC/AT handles the port addressing for all lines
and internally directs the program responses to the
ports. This type of setup needing only the one computer,
but is limited in that it can't perform activities
outside the program or DOS shell support.
It is not possible to run doors, external protocols, or
any other program as a sub-process.
The second method loads a separate copy of the BBS
program into memory for each line or node. This setup
allows an individual node to perform whatever activity
or BBS maintenance event it desires, while allowing the
remaining lines to perform independent activity.
The disadvantage is the extra memory required for multi-
tasking software or additional hardware for network
operation.
I use the second method because it is REQUIRED for doors
and external file transfer protocols. This, by no
stretch of the imagination, means that Osiris, or any
program, can just leave everything up to the multi-
tasker or network software. That simply would not work
and your hard drive would end up a mass of mangled
files.
Osiris SE Technical Reference Manual Page 193
I'll not get into the specifics of what Osiris does,
most of it is pretty technical, just don't attempt to
run multiple copies of any program that updates files
unless that program SPECIFICALLY says it can handle it.
Hardware/Software
In the following discussion the term "multi-line" is
the same as "multi-node."
Likewise, both a "line" and a "node" refer to a single
Osiris session connected to a single modem and phone
line.
I've designed Osiris to operate in single line mode on a
single PC system, or in multi-line mode in any of three
general configurations:
Local Area Networks
I've included support for file and record locking
under Novell, 3-COM, Banyan Vines, PC-MOS 386,
Network OS, LANtastic, and any networks that truly
support DOS 3.x SHARE. Keep in mind that several
peer-to-peer networks claim SHARE support, but do
not actually have it!
In a LAN environment, each Osiris line operates on
a separate computer connected to the other PCs or
ATs via network cable. Each line runs its own copy
of Osiris which is loaded from server's hard disk.
A "server" in this context is used to define any
computer in a LAN setting that allows sharing any
of its peripherals such as hard disks, printers or
other devices.
Some network configurations only allow sharing
programs located on a "dedicated server," one that
only performs LAN management functions. Others
enable sharing of disk devices located in other
workstations and are normally referred to as peer-
to-peer networks. In a network which allows
multiple "servers," the server computers can also
be used as a workstation for an Osiris node. Each
workstation running Osiris is assigned a separate
and unique Node ID Number.
Regardless of the network used, only one copy of
Osiris needs to be kept on the disk. This copy is
available to each workstation running a Osiris
node. All workstation nodes may update and access
a common message, file, and user databases.
Osiris SE Technical Reference Manual Page 194
Slave Card System
This setup requires an AT or clone and a slave card
such as Alloy's PC-Slave, which is available in
8088 (NEC V-20) and 80286 versions. A slave card
usually contains a CPU (8088/V-20, or 80286), a
serial port, a keyboard port, and a monitor port.
Each slave card is actually a PC on a card which
interacts with and shares the other peripherals in
the PC, including the hard disk.
In brief, a slave card environment is one in which
a single machine adds one or more slave cards with
a modem and phone line connected to each slave
card. Osiris is loaded in the memory of each card
just as if it was a separate PC system, and it uses
the shared hard disk of the main system for
storage. Some slave systems allow viewing access
to each slave PC environment via the main system
keyboard and screen. The cost factor in this setup
can approach or exceed the LAN setup, depending on
the network type and PC cost.
A spin-off on the slave card environment is the
multi-PC card from CUBIX. It installs in a Novell
network server and operates 2 workstations from
within the network server.
Desqview
For those interested in running only 2-3 or
possibly 4 nodes, it can done on a single
80286/80386 system under DESQview, a multi-tasking
operating environment available from Quarterdeck
Office Systems, 150 Pico Blvd., Santa Monica, CA
90405, (213) 392-9701. Although very fast 386
combinations may be able to run 4 or 5 nodes, I've
found that performance may suffer significantly on
slower systems when more than 2 serial port
applications. I only recommend 2 nodes under
DESQVIEW, unless you are prepared to upgrade your
serial port UART chips.
A DESQview setup involves purchasing DESQview ver.
2.25 or above from Quarterdeck and installing it on
your 286/386 system. Earlier versions will not
operate well with multiple serial applications and
are not recommended. To establish 2 DESQview
applications you will need at least 512K of
Expanded memory. Make certain the memory board you
purchase is fully compatible with the DESQview
memory manager - check with Quarterdeck for
details.
Osiris SE Technical Reference Manual Page 195
You need memory which meets the specifications for
either AST's EEMS version 3.2 or LIM 4.0.
Caution
The continual switching back and forth between
the "real" and "protected" mode of CPU can
result in lost interrupts and system lock-ups
makes using EXTENDED memory to emulate
EXPANDED unreliable.
I do not recommend extended memory use for any
purpose, even extended memory which is
"converted" to EMS memory by use of a software
driver.
This type of multiple line set up is the only one
in which the performance of the BBS program may be
hindered, because of time-slicing. By contrast,
both LAN and slave cards offer almost full
throughput.
The number of nodes actually possible under
DESQview will depend on several variables,
including the speed of the microprocessor & clock,
the baud rates of the connections, and the speed of
the hard disk.
The memory requirements for Osiris operating under
DESQview is about 330K - 350K for each copy of
Osiris. This means that the total memory required
easily exceeds the 640K base memory area. A system
with 512K of expanded memory will operate 2 lines.
Although my recommendation is for no more than 2
nodes under DESQview, there are some situations
which may allow additional nodes to be added. If
a fast 286 or 386 CPU is used, you may find that
an additional node or two can be added with little
or no impact on performance.
If the majority of your callers will be operating
at 2400 baud, additional nodes may also be
possible. Testing your set up is the only method
of determining the actual limits.
Osiris SE Technical Reference Manual Page 196
Novell
Novell offers several versions of NetWare including the
entry level system ELS Level I, ELS Level II, and
Advanced NetWare. ELS I is limited to 4 workstation
connections, including a non-dedicated server that can
operate as a workstation. ELS II is limited to 8
workstation connections and also uses a non-dedicated
server that doubles as a workstation.
ESL, Level I and Level II, are priced significantly
lower than Advanced NetWare which will allow up to 250
Osiris nodes.
It's been reported that Advanced NetWare ver. 2.15 is
capable of operating two nodes on a single workstation
using DESQview. This type of configuration allows
you to operate six nodes using 3 AT's connected as
Novell workstations, with each AT running 2 BBS lines.
Peer-To-Peer Networks
This section reviews generic peer-to-peer networks using
LANtastic as an example. From an operational
viewpoint, these networks will function much like any
other. The primary difference is the use of multiple
"servers." If multiple workstations are used as servers
for various system resources, the same server /
workstations may also be used as a Osiris node. Each
node must still be given a unique Node ID.
Lantastic
This network operates Osiris well when configured
properly. The following network parameters have
been found to increase reliability and improve
operation:
DOS ver. 3.1 or 3.3 are recommended, version 3.2 is
not fully compatible with the network communication
interfaces. The SHARE command is not necessary
since LANtastic emulates SHARE in the LANBIOS.
For maximum performance, I recommend using a small
disk cache system with LANtastic.
Osiris SE Technical Reference Manual Page 197
Slave Cards
This follows the same Osiris software setup procedures
as a network. The only real difference here is that
SHARE must be loaded in EACH SLAVE ENVIRONMENT.
Alloys' PC Slave system is established to act much like
a network with no cables connecting the individual
workstations. Instead, each workstation is actually a
card installed into the bus on the "server."
Alloys' own network software is NTNX. Setup the
hardware and software according to the instructions from
Alloy. If the slave cards are populated with 1
megabyte of memory, I recommend allocating 512K for the
slave partition and the remaining 512K as a system disk
cache within NTNX.
The Osiris configurations on the slave cards are
established on the server hard disk exactly like any
other network setup.
The individual slave cards may be accessed by connecting
directly to the cards via terminals (monitor &
keyboard). Alloy cards also operate with the utility
program NXSCAN to control slave cards from the server in
real time without using additional terminals.
The NTNX software includes a utility to monitor each
slave from the server, although interaction is not
possible.
When operating a slave system, all Osiris sessions MUST
answer the phone by Auto-Answer. Alloy uses the ring
detect line, pin 22, to reboot the individual slaves
from the server.
Desqview
DESQview should be set up with two windows and follow
the same procedures as a network. The only real
difference here is that SHARE must be loaded before
starting the DESQview program with DV or XDV. There is
no need to load SHARE in each DV window.
Osiris is DESQview "aware" and will recognize when it is
operating in a DV environment. When the TX buffer can
no longer take data, I'll slice time to the other
partitions. The same holds true when Osiris is waiting
for input. If no input is available, I'll slice time to
the other partitions.
Osiris SE Technical Reference Manual Page 198
I'll only scan the local key board every 30th time
though the input loop. This degreases the drain on the
CPU and gives other partitions more time. If you're
attempting to run more than 2 nodes, it is suggested
that you increase this to about 60. Do not go to far
over this or carrier monitoring could be affected.
I recommend using DESQview version 2.25 and above. I
also strongly suggest using the 16550A UART chip as a
replacement for the 8250 or 16450 found in most RS-232
boards. Using this chip becomes even more important
when more than two Osiris nodes are configured on a
single machine.
This chip is inexpensive and is available from several
sources at a nominal cost, including Arrow Electronics
at 1-800-932-7769.
The Initial setup of DESQview (SETUP.BAT) allows setting
performance parameters which affect the processing time
allocated to foreground and background tasks. You'll
want to experiment with these settings, but should begin
with each task receiving equal time if both are
operating an Osiris node. Start with 3 ticks for each
node. If you're operating a single BBS in the
background while using the foreground for other
activities such as word processing, you then should
allow the background task more time by a factor of about
3.
The following shows the major setup parameters and the
proper settings for a 2 line BBS under DESQview.
The important parameters here begin with the second half
of the page. Optimize communications must be set to "Y"
to operate high speed modems reliably. In addition, you
should load the Osiris node that uses the highest baud
rate first. Doing so prevents the 0-640K area of memory
from becoming fragmented since communications programs
are never swapped out, and guarantees the best transfer
speeds. In addition, if an Enhanced Expanded Memory
board (EEMS) is being used DESQview will make use of its
"instantaneous" mapping registers for the first program
while assigning all other programs to the slower
registers with mapping overhead. Remember that the
processing power of your PC ultimately limits how many
high speed communications programs may be run
simultaneously without dropping characters.
Osiris SE Technical Reference Manual Page 199
Swapping programs may be set to "Y", although Osiris
should never be swapped out of memory. This parameter
allows other programs this option. Printer contention
should not be managed since DV will suspend a program
that attempts to print if another is already printing.
I recommend setting DV to indicate that Osiris does NOT
write directly to the screen (even though it does).
Fine tuning DESQview parameters WILL be helpful.
To ensure that you never get a Share Violation message
asking for "Retry, Abort, or Fail," the DOS critical
interrupt will be taken before any OPEN File request to
prevent such message or error from halting the
program. The normal interrupt vector will be restored
following the open call.
Exception 13 Errors
Desqview can, at times, come up with an exception
13 error. No one really KNOWS what this error
message means. If they do, they don't want to share
that information with anyone.
It also only shows up on SOME systems while others
NEVER see it. Which indicates that it has something
to do with the way your system is configured.
Someone DID figure out that changing two parameters
within Desqview "SEEMS" to make the error message
go away.
Try changing the COMMON MEMORY from 17K to 20K and
change the DOS BUFFERS FOR EMS to 5. You may need
to go higher on one or both of these settings but
try the 20K and 5 first.
Very Important Read This
Despite the method of multitasking, you will NEED to set
your EXE, COM, OVL (overlay), and OVR files to READ ONLY
to prevent DOS SHARE violations.
When DOS loads an EXE or COM, it opens it in READ/WRITE
mode. If two or more nodes attempt to LOAD the same
program, a protocol driver or archiver, you can get a
share violation. Since this is external to Osiris, I
cannot trap it.
I have included a program in the package, setlock.exe,
that allows you to MASS set, in the current directory,
EXE, COM, OVL, and OVR files to READ ONLY.
Osiris SE Technical Reference Manual Page 200
The program is easy to use. Log into the directory and
type SETLOCK /L <ENTER>. This sets all the COM, EXE,
OVL, and OVR files in the current directory to READ
ONLY.
If you need to set them back to READ/WRITE, to delete or
replace one of the programs, log into the directory and
type SETLOCK /U <ENTER>. This will set all the COM, EXE,
OVL, and OVR files in the current directory to
READ/WRITE mode and you can make the required changes.
But, don't forget to change them back to READ ONLY.
Help
The VAST number of methods that CAN be used and the
differences that can exist between individual set ups
forces me to limit Technical support to only the
OSIRIS interface.
I cannot offer setup, installation, operational help,
or maintenance support for other produces such as
Desqview, Novell, Lantastic, etc.
Games Or Doors And Other External Program
There is no standardized method of setting up for external
programs, which isn't surprising. The Capitol PC User
Group's program, RBBS-PC, handles this feature using a
specific format, which is unique to RBBS-PC. In fact, RBBS-
PC uses several different formats, depending on what version
of the software you happen to be using.
PCboard is another prime example. It uses several different
door formats depending on what version of the software you
are using.
Other BBS programs use similar, but somewhat different,
methods of passing parameters to external programs. In fact,
there are so many different , incompatible, formats door
authors have a hell of a time picking out the one they want
to use.
You'll find a lot of door programs for Pcboard and RBBS. Not
because either is considered to be an excellent BBS package,
they're not. They aren't BAD packages, just not excellent
packages. It is because they have been around a LONG time and
most DOOR authors have also been around a long time and they
are familiar with the Pcboard or RBBS layout.
I've joined the ranks by adding my own specific format. there
are programs available, Qkdoor and Doormaster to name a
couple of the more popular ones, that converts the Outxxx.Qbs
file to almost any format.
Osiris SE Technical Reference Manual Page 201
Qkdoor/Doormaster Approach
Several BBS' packages have internal door support for
different formats, Osiris does, but that is not really
the best approach.
Door formats can change rapidly, as RBBS and PCboard
have demonstrated all to well. And, new Door formats
come out almost monthly.
If you must rely on the door system built into the BBS
package, you can be left out in the cold when a door
format changes or a new one comes out. You'll have to
wait for a new version of the BBS software, which could
take a year or two.
Using external DOOR programs, like QKDOOR, eliminates
that problem. The authors of Door programs generally
keep up to date on the current DOOR control files and
when one changes or a new one comes out, they can
quickly add it to a new version of their software.
There isn't any real advantage to using the door
control file system built into the BBS package. You
still have the same number of commands and steps to go
though. You'll either tell me or the Door program.
Games
With Osiris, you're not locked into having to set-up games in
any specific fashion or location. You can install a game or
game system any place.
The most obvious place to install a game sub-system is off
the main menu using one of the MAINx.PRG files.
You'll generally set-up the game sub-system using SPL/I and
shelling to batch files, or directly to the program once you
have become prolific with SPL/I.
You do not have to worry about having enough memory. VMS will
give you just as much memory as your system had before you
called Osiris. Usually this will be at least 512K. More or
less, depending on what you had to start with. I have 622K
FREE when I shell to games.
Installing A Game Sub-System
For this tutorial, I'll use the following seven games:
Osiris SE Technical Reference Manual Page 202
Scrabble
Fishing
Acey Deucey
Pit
Galactic WarZone
Tetris
Yankee Trader
What I'm about to show you is very simplistic in nature
and most certainly not the only way to do things. You
can get VERY creative with SPL/I and I've seen some
very unique game systems that were works of art with
multiple menu systems, windows, kaleidoscopes of
color and form.
Step 1, Setting The Menu
The first order of business is the menu. The
callers have to have some method of selecting which
game they want to play.
There are two methods of designing a game menu. The
first is using a draw program, like "THEDRAW," to
draw out the menu. This is the best approach since
it is WYSIWYG and you don't get any surprises when
you display it for the first time.
The second method is "BY HAND." You use a text
editor and lay out the menu and add the SPL/I color
commands by hand. Some folks like this approach,
but I've found that you almost always have to go
back and readjust your menu because things seldom
line up correctly the first or even the second time
around.
Let's assume you selected the first method and you
have drawn a simple menu using light blue, yellow,
gray, bright white, and light green colors. You
saved the menu using THEDRAW command clear screen,
no limit on line length, and the file name was
games.ans.
You've now got the basic game menu, but it is in
ANSI format and we want to get it into MMU format
so ALL callers can use it, not just those
supporting ANSI. Compile the "GAMES.ANS" file
using the MMU compiler, MMU.EXE. Use the
command line:
MMU GAMES.ANS /A /F
Slash A tells the MMU compiler the file "GAMES.ANS"
is an ANSI file.
Osiris SE Technical Reference Manual Page 203
You'll end up with a file called "GAMES.MMU," the
original "GAMES.ANS" will not be altered.
It might look something like this, minus color,
when displayed:
Game Menu
A) Scrabble
B) Fishing
C) Acey Deucey
D) Galactic WarZone
E) Tetris
F) Yankee Trader
X) Quit To Main Menu
Selection ?
Not fancy, but adequate. You can get as fancy as
you like when you do yours.
Now that we have our menu, we have to setup an
SPL/I command file to display it, get the selection
from the caller, and execute the game they have
selected.
Lets call the command file, GAMES.SCR, SCR stands
for SOURCE.
Since we're going to get a menu option from the
caller, we'll need to define a variable to HOLD the
selection. Lets use 'CH', CH short for CHARACTER.
_define_var(ch,character);
The next step is a controlled loop to HOLD the
caller in the game program until WE decide to let
him out, when he selects the X option.
We'll need a control variable that can be used for
a test expression, lets use NOT_DONE. That name
tells us what the it does just by looking at it.
_Define_var(Not_Done, Integer);
We also want to set NOT_DONE to some value other
than 0 so it will return TRUE when tested.
_Assign(Not_done,1);
Osiris SE Technical Reference Manual Page 204
The loop itself will be a WHILE loop and looks
something like
_while(not_done);
_wend;
Lets put everything we've defined, so far,
together:
_define_var(ch,character);
_define_var(not_done,integer);
_assign(not_done,1);
_while(not_done);
_wend;
_mend;
That's our basic SPL/I game command file. It will
continue to LOOP until the variable NOT_DONE has
something in it other than 0. As soon as NOT_DONE
has 0 in it, it'll fail the test and the loop will
terminate.
The FIRST thing we want to do inside the LOOP is to
clear the screen and display our menu so:
_CLS();
_DISPLAY_TEXT("C:\osiris\games.mmu");
I'll assume you placed the games.mmu file in the
directory c:\osiris. You can put it anywhere you
want as long as you include the full drive and path
to the file.
The next step is to stop and get the selection from
the caller using the _getc(ch,1) statement. The 1
tells me to convert the selection to UPPERCASE. In
other words, if you typed in 'a', I'll convert it
to 'A'. That will make testing a little easier to
do.
Osiris SE Technical Reference Manual Page 205
If we put it all together, we now have something
like:
_define_var(ch,character);
_define_var(not_done,integer);
_assign(not_done,1);
_while(not_done);
_CLS();
_DISPLAY_TEXT("C:\osiris\games.mmu");
_getc(ch,1);
_wend;
_mend;
The way the program's currently set-up, you would
go into an infinite loop; the menu would be
displayed and you'd get a selection from the
caller; over, and over, and over until you finally
have to hang-up to get out of it. So we have to add
some _IF statements to determine WHAT the caller
selected and what action we want to TAKE.
Osiris SE Technical Reference Manual Page 206
Processing The Selection
Since we have seven possible selections, we'll need
seven IF statements to test what we have. Lets put
those in:
_define_var(ch,character);
_define_var(not_done,integer);
_assign(not_done,1);
_while(not_done);
_CLS();
_DISPLAY_TEXT("C:\osiris\games.mmu");
_getc(ch,1);
_if(ch = 'A');
_endif;
_if(ch = 'B');
_endif;
_if(ch = 'C');
_endif;
_if(ch = 'D');
_endif;
_if(ch = 'E');
_endif;
_if(ch = 'F');
_endif;
_if(ch = 'X');
_endif;
_wend;
_mend;
Osiris SE Technical Reference Manual Page 207
You'll notice that I used UPPERCASE letters inside
the _IF statements. CASE DOES make a difference
and 'A' is NOT the same as 'a'. But, I used the 1
in _getc(ch,1), so I don't have to worry about 'a'.
1 means I'll never get a lower case character.
Now that we have all the _if tests set-up, we can
go in and do what we want to do if the caller
enters that particular selection.
X is the most obvious one to start with and X means
you want OUT of the menu. Since NOT_DONE is driving
our LOOP all we have to do is set NO_DONE to 0 and
the LOOP will terminate.
_CLEAR(NOT_DONE) will do that so :
_IF(ch = 'X');
_clear(not_done);
_ENDIF;
Before we do any of the other _IF statements, let
me explain one of the commands we'll be using, the
execute statement.
The EXECUTE() statement tells me that you want to
execute an external program. Unlike other BBS
programs that exit with errorlevels, Osiris will
remains in memory and uses the VMS manager to free
up the memory needed to execute the external
application. The VMS manager will use either EMS or
your disk for memory segment swapping.
For the moment, I'm going to assume that you are
going to use external batch files, Qkdoor to create
the appropriate door file, and execute the external
game.
I would suggest beginners use this method since it
is similar to the methods other BBS programs use.
We can get into other, more advanced, methods a
little later on.
We'll also need to add another variable to hold any
possible return code although in this case there
will be none, but . . . execute() REQUIRES us to
provide one so
_define_var(rtcode,integer);
Osiris SE Technical Reference Manual Page 208
Lets also pretend that you're using the batch
files, that's why there will be no return code:
Scab.bat
Fishing.bat
ACEY.bat
galwar.bat
Tetris.bat
trader.bat
Our program, including the execute statements
should now look like:
_define_var(ch,character);
_define_var(not_done,integer);
_define_var(rtcode,integer);
_assign(not_done,1);
_while(not_done);
_CLS();
_DISPLAY_TEXT("C:\osiris\games.mmu");
_getc(ch,1);
_if(ch = 'A');
_execute(0,"scab.bat",rtcode);
_endif;
_if(ch = 'B');
_execute(0,"fishing.bat",rtcode);
_endif;
_if(ch = 'C');
_execute(0,"acey.bat",rtcode);
_endif;
_if(ch = 'D');
_execute(0,"galwar.bat",rtcode);
_endif;
_if(ch = 'E');
_execute(0,"tetris.bat",rtcode);
_endif;
_if(ch = 'F');
_execute(0,"trader.bat",rtcode);
_endif;
_if(ch = 'X');
_clear(not_done);
_endif;
_wend;
_mend;
Osiris SE Technical Reference Manual Page 209
For a more detailed explanation of _execute, see
the sub-section on _execute() command.
That's IT! We now have a COMPLETE game system about
ready to go on-line.
Compiling Games.scr
The game program will have to be compiled with the
SPL/I compiler before I can use it. Assuming you
are going to use MAIN1.PRG, rename GAMES.SCR to
MAIN1.SCR and compile it with ITC using the
following:
ITC main1
ITC will, if you made no typing errors, produce
MAIN1.OBJ. If the compiler stops with an error
message, correct the error and recompile.
Assuming you got a successful compile, your next
step is to LINK the OBJ file to produce the runable
program file. Use ITlink and the following command:
ITLINK MAIN1
MAIN1.PRG would then be created containing the
runable SPL/I code. Move MAIN1.PRG to your Text
directory.
The Individual Game Batch Files
Most games require some type of control file containing
information about the com port, baud rate, and user
information for the CURRENT caller.
All BBS systems provide door control files, but rarely
are they compatible.
The game authors generally provide direct control file
support for the BBS programs they're using.
You have to translate, in most cases, the file I use to
the format the game understands. You don't have to do
this manually. Several programs can take the OUTxx.Qbs
file and translate it to any number of formats. Qkdoor
is widely used and we'll use it in these examples.
In our sample batch, <EOF> indicates the END of the
batch file and it's not actual PART of the file. <START>
indicates the beginning of the batch file. Remember,
neither <START> or <EOF> are parts of the actual batch
file.
Osiris SE Technical Reference Manual Page 210
I'm not going to do each and every batch file since they
are all basically alike. I will do two, scab.bat and
fish.bat, which should be enough to give you the
generally idea.
Scab.bat
Scrabble, selection A, can use an older format of
the Osiris control file which use to be called
extinfoX.qbs, X being the Node number you're
using. The new format is OUTx.QBS with x being the
node number. Just copy it to the old file name, the
part that scrabble uses is still the same.
<START>
copy out1.qbs extinfo1.qbs
scrabmn scrabble.cfg
<EOF>
Fish.bat
The second menu option was fishing.bat:
<START>
qkdoor c:\osiris\OSSE1 c:\osiris\fish\QBBS
cd fish
FISHING 1 C:\Osiris\FISH
<EOF>
The first line calls QKDOOR, passing the parameters
it needs.
Qkdoor Parameters
The first parameter, c:\osiris\OSSE1, gives it
the full drive, path, and node number for the
file Osiris created. The second parameter,
c:\osiris\fish\QBBS, gives the drive, path,
and TYPE of control file you want written. The
program you're going to run and control file
must be in the same directory.
"QBBS" tells QKDOOR to write a QuickBBS'
external control file in the sub-directory
"C:\OSIRIS\FISH"
The Qkdoor.doc file gives a complete run down
of available Door control files Qkdoor can
handle. It supports most of the popular
formats.
Osiris SE Technical Reference Manual Page 211
The line "FISHING 1 C:\Osiris\FISH" is
specific to the program you're calling and
varies according to the special needs of that
program.
You don't have to worry about changing back to the
Osiris directory before exiting the batch file, I save
the current drive and directory before calling the batch
files or external programs and I'll restore you to the
original, preshell, directory when you return.
Dorinfo1.def/Door.sys
I do directly supports DorinfoX.Def and Door.Sys via
SPL/I command calls.
Dorinfo1.def
If you want to create the DorinfoX.Def directly,
bypassing external Door programs, issue the command
_dorinfo(path,program) replacing PATH with the full
drive/path to the sub-directory you want the
dorinfoX.def file written in and PROGRAM with the
name of the external program to execute.
I'll automatically create the correct Dorinfox.Def
depending on which node you are on.
E.g., if node 1 then Dorinfo1.def will be created.
E.g., if node 2 then Dorinfo2.def will be created.
Due to the limitations placed on the DorinfoX.def
file, by the author of the file format, Dorinfo can
only be used on nodes 1 through 9.
E.g., proper dorinfo1.def call:
_dorinfo("c:\osiris\tradewar","twar.bat");
Please pay attention to the path part of the
command. It is a proper DOS path and should NOT end
with a backslash.
Door.sys
If you want to create the Door.sys directly,
bypassing external Door programs, issue the command
_doorsys(PATH,PRG); replacing PATH with the full
drive/path to the sub-directory you want the
DOOR.SYS written in and replace PRG with the name
of the external program to execute.
Osiris SE Technical Reference Manual Page 212
Door.sys is NOT a multiple user door file and
cannot be used on more than one node at a time.
E.g., proper door.sys call:
_DOORSYS("c:\osiris\tradwar","TWAR.BAT");
Please pay attention to the path part of the
command. It is a proper DOS path and should NOT end
with a backslash.
Osiris SE Technical Reference Manual Page 213
Slightly Advanced Game System
_define_var(ch,character);
_define_var(not_done,integer);
_define_var(rtcode,integer);
_define_var(com,integer);
_assign(com,_PORT);
_assign(not_done,1);
_while(not_done);
_CLS();
_DISPLAY_TEXT("C:\osiris\games.mmu");
_getc(ch,1);
_if(ch = 'A');
_elseif(com != 2);
_call(error);
_else;
_execute(0,"scab.bat",rtcode);
_eend;
_endif;
_if(ch = 'B');
_elseif(com != 2);
_call(error);
else;
_execute(0,"fishing.bat",rtcode);
_eend;
_endif;
_if(ch = 'C');
_elseif(com = 4);
_execute(0,"acey4.bat",rtcode);
_else;
_execute(0,"acey.bat",rtcode);
_eend;
_endif;
_if(ch = 'D');
_elseif(com != 2);
_call(error);
else;
_execute(0,"galwar.bat",rtcode);
_eend;
_endif;
_if(ch = 'E');
_elseif(com != 2);
_call(error);
else;
_execute(0,"tetris.bat",rtcode);
_eend;
_endif;
_if(ch = 'F');
_elseif(com = 4);
_dorinfo("c:\osiris\twar4",trader4.bat);
_else;
_dorinfo("c:\osiris\twar",trader.bat);
_eend;
Osiris SE Technical Reference Manual Page 214
_endif;
_if(ch = 'X');
_clear(not_done);
_endif;
_wend;
_mend;
_procedure(error);
_define_var(ch,character);
_printf("\n\nI'm sorry, but you have to be on COM2\n");
_printf("to play this game.\n\n");
_printf("Press any key to continue\n");
_getc(ch,0);
_pend;
Explanation
What I've done above is slightly more advanced and
uses several new, you haven't seen them yet,
SPL/I commands that might be required on a
multiple line system. For a more detailed
explanation of the SPL/I commands, reference
the section on SPL/I.
I'm assuming that this system runs two nodes,
one on com port 2 and one on com port 4. I'm also
assuming that several games do not support com
port 4 and those that do may need a different
type of control file.
I've also intermixed the _execute() and the
_dorinfo() methods of calling the games.
Because I've got two serial ports to deal with,
I'm going to use the elseif statements inside
the _if statement. There are other methods, but
those are a bit to complex for you at this time.
If you're on a serial port the game does not
support, I'm jumping to a procedure that tells
you to switch nodes if you want to play. The
method of jumping to the sub-routine is similar
to the BASIC GOSUB, for any basic programmers that
may be reading this.
Osiris SE Technical Reference Manual Page 215
Overlaying A Game
This is a method of calling an external game that I
call,"OVERLAYING" because it is almost like the game is
part of Osiris, especially if you have LIM 4.0.
_if( ch = 'A');
_chdir("c:\osiris\twar");
_dorinfo("c:\osiris\twar","twar -Qbbs");
_chdir("c:\osiris");
_endif;
You'll see a new SPL/I command used here, "CHDIR(path);"
as well as a slight variation to the "_DORINFO()"
command.
_CHDIR(PATH) is equivalent to the DOS "CD" command
except the SPL/I version will also change drives.
If you use this command, be SURE and change back to your
OSIRIS= directory. If you don't, strange things may
happen later on.
The DORINFO() command, and the DOORSYS() commands allow
you to pass command line parameters to the program
you're calling. Just include the parameters following
the name of the program.
Advanced Set-Up
Here I'm going to show you how to govern what times and
days you're allowed to play games. It's a good example
on combining low level SPL/I commands and multiple
conditional tests.
See SPL/I section for additional information on the
commands used in this section.
Lets assume that we have a game, Tradewars, and we only
want to allow callers to play this game on Saturday and
Sunday between 8 AM and 5 PM.
_define_var(time,integer);
_define_var(hr,integer);
_define_var(min,integer);
_define_var(sec,integer);
_define_var(day,integer);
_define_var(hund,integer);
_define_var(ch,character);
_define_var(rtcode,integer);
Osiris SE Technical Reference Manual Page 216
_if(ch = 'A');
_dayofweek(day);
_elseif(day = 6 .AND. day = 7);
_systime(hr,min,sec,hund);
_math(time = hr * 60 + min);
_elseif(time > 479 .AND. time < 1020);
_execute(0,"twar.bat",rtcode);
_else
_printf("I'm sorry, but you can only play this\n");
_printf("Game between 8 AM and 5 PM.\n\n");
_printf("Press any key to continue.\n");
_getc(ch,0);
_cls();
_eend;
_else;
_printf("I'm sorry, you can only play this game on\n");
_printf("Saturday and Sundays.\n\n");
_printf("Press any key to continue.\n");
_getc(ch,0);
_cls();
_eend;
_endif;
The first thing I did was to retrieve the current day of
the week. If the day of the week wasn't 6 (Saturday) or
7 (Sunday) then there was no need to go any further.
Just display the error message and return.
Providing the day was right, I retrieved the current
time and converted it to MINUTES, that's not the only
way but it is easy.
479, 7.59 AM, would be the number of minutes since
midnight and 1020, 5 PM, would be the number of minutes
since midnight.
If the current time is greater than 479 and less than
1020, then it's OK to play the game.
Advantage
One of the primary advantages to this method of
servicing external programs is the ability to regain
control if the external program locks up. Simply press
Ctrl-Alt-INS at the same time and I'll seize control of
the computer and bring you back up.
Osiris SE Technical Reference Manual Page 217
Problem Areas
If you have a 16550 Uart, you could run into some
problems with external games. Most of them do not
support a 16550 and if one is active, they'll lock up.
The safe way around this is to DEACTIVATE the 16550
before calling the game and then REACTIVATE it after you
exit the game.
I use a program called 16550.EXE and I believe it is
included with the QKDOOR package.
e.g.
<START>
qkdoor c:\osiris\OSSE1 c:\osiris\fish\QBBS
16550 1 OFF
cd fish
FISHING 1 C:\Osiris\FISH
16550 1 ON
<EOF>
If you have a 16550 Uart, then the odds that you are
running a locked DTE rate of 19200 baud or 38400. QKDoor
will read the Osiris Lock variable so that you get the
correct results.
You should be warned that a lot of games will work just
fine at 2400 baud but cannot be used at high speeds.
Fossil
Some games require a fossil to run, it is rare, but
we'll cover it anyway.
The best method is to load the fossil before calling the
game and then unloading it after you exit the game.
The BRAND of fossil, there are several, doesn't really
matter. We'll use BNU, not the best one but it will do
in a pinch.
Osiris SE Technical Reference Manual Page 218
Batch file using a fossil with a LOCKED DTE of 19200
baud.
<START>
qkdoor c:\osiris\OSSE1 c:\osiris\game2\QBBS
CD game2
bnu /L2=19200
twars 1
bnu /U
<EOF>
That should give you a good idea how games can be called
and a little insight as to how you can work with OTHER
SPL/I commands to create master pieces of your own.
Door Technical Support
One final note about external programs. I must limit
technical support to problems with the OSIRIS interface
only.
This means that I can't extend advice on specific door
operation or hardware system configurations.
The responsibility for set up and operation of specific
programs rests with you. I make NO commitments that any
DOOR/external program will run properly on your system.
Each program operates differently and may require a
conversion program, special device driver, basic run
time module (BRUN40, etc.), or other type of
manipulation to operate.
Some versions of DOS, in combination with some IBM
compatible hardware, do not function properly with the
CTTY command or with some programs. THIS IS A
DOS/HARDWARE PROBLEM, AND NOT A FLAW IN OSIRIS.
Questions on specific programs should be directed to the
program author. I DO encourage DOOR authors to contact
me concerning configuration advice and possible testing
of their product within my beta group.
Private Cbis Systems
If you want to set up a PRIVATE BBS, then set the default
new user access level to zero.
If the default new user access level is zero, no new callers
will be allowed to log-in. A text file called
"PRIVATE.ASC/MMU/ANS," if it exists, will be displayed.
Osiris SE Technical Reference Manual Page 219
Callxxx.cnt
Caller counters for individual nodes are maintained
instead of a SYSTEM wide count. Each nodes caller count can
be found in the file CALLxxx.CNT, xxxx is node number in base
ten.
The file contains a single 4 byte long integer.
Rcp, Remote Command Processing
This gives Osiris the ability to tell the remote DTE to do
certain things.
1. Request the remote DTE to send the name defined in the
dialing directory entry used to place the call (used for
hands off log-on).
2. Request the remote DTE to send the password defined in the
dialing directory entry used to place the call (used for
hands off log-on).
3. Request the remote DTE to start a download, used to auto
trigger a download session once the "S" has been pressed.
4. Request the remote DTE to start an up-load, used to auto-
trigger an up-load session once "S" has been pressed.
5. Request the remote DTE to hang-up.
The remote DTE must support RCP commands for this to work. QT
1.02 supports the above commands.
Message Cache
Osiris uses an internal disk cache system when reading
messages for display purposes. The size of this cache is set
to 4096 bytes.
Osiris SE Technical Reference Manual Page 220
Key.def
The file contains 256 ASCII flags set to either ON or OFF.
This tells me which characters to accept, when getting input
from the caller.
The purpose is to disallow characters that :
1. Do not meet Fidonet, RCSA, UUCP, and other network
standards.
2. To cut down on the effects of NOISY lines.
A default KEY.DEF has been included that meets the above
requirements.
You may toggle individual characters on or off from within
OSM.
When you select this option, characters with a check mark are
turned ON or allowed.
Some languages, French for instances, use accented characters
that do not fall within the accepted standards of
international message formatting. You may turn the accent
characters on, but you should check to be sure you aren't
violating the standards of any networks you belong to.
Line Noise
The key.def concepts works so well line noise, for the
most part, will be filtered out. The caller will be
lured into a false impression that the lines are CLEAN
when in fact, they may be very bad, to bad for a file
transfer.
Osiris will TRACK the number of LINE HITS received
during each connect. When, if, you start to download a
file or files and LINE HITS have been received, I'll
display the message:
Noise to Signal Ratio: X to y.
Continue <Y/n> ?
X is the number of LINE HITS and Y is the number of
minutes ON-LINE for the current call.
Osiris SE Technical Reference Manual Page 221
E.g.
Noise to Signal Ratio: 12 to 3
That would indicate 12 Line Hits within the last 3
minutes. If one of the line hits had occurred during a
file transfer, a resend would have resulted.
Auto Daily Report
To keep you abreast of what's happening, I'll generate a
daily system report to you, one for each node you have
on-line.
Each time Osiris is called, I'll check to see if the date
has changed. If so, the caller will be asked to please wait
while I generate the report. The wait will be short, 4 or 5
seconds, tops.
Osiris SE Technical Reference Manual Page 222
A typical Daily report will look something like this.
Node 1 Activities Summary for Thu August 1, 1991
Total Calls : 31
In-Use Time : 397 Min(s)
Utilization : 27.57 Percent
New Callers : 4
Ron Hebert
Casino Sagonis
Jeff Lentini
Gail Long
Downloads : 22 Files 2694646 Bytes
d:\general\Tnt100a.lzh
d:\isis\I510b.lzh
d:\isis\I510a.lzh
d:\drivers\Tmod630.exe
d:\drivers\Qt104.exe
d:\arcshell\Arcshell.lzh
d:\drivers\Tmod630.exe
d:\drivers\Qt104.exe
d:\arc\Lha212.exe
d:\arc\Newzoo.exe
d:\add_on\List75i.lzh
d:\drivers\Tmod630.exe
d:\drivers\Qt104.exe
d:\drivers\Tmod630.exe
d:\drivers\Qt104.exe
d:\drivers\Qt104.exe
d:\drivers\Zmax100b.exe
d:\isis\I510b.lzh
d:\isis\I510a.lzh
d:\arcshell\Arcshell.lzh
d:\isis\Nodediff.lzh
d:\isis\Otc200.lzh
Uploads : 1 Files 86144 Bytes
d:\uploads\Oilcap2.zip
Osiris SE Technical Reference Manual Page 223
On-Line Store
Now we are about to enter the realm of on-line shopping.
This is going to be harder for ME to explain than it is for
YOU to set up. Figure on calling the TECH support BBS at
least once on this one. If you get it set up WITHOUT having
to get help, pat yourself on the back, you deserve it.
The first step is the creation of a sub-directory called
"ONLINE." Create this directory in your OSIRIS= directory.
e.g. mkdir C:\OSIRIS\ONLINE
Please use ALL the names I use. It'll help a lot when or if
you need help.
You'll put the information files about the on-line store,
databases, in this directory.
You'll place all of them there except for 'STORE.DEF'. This
is the file you create that tells ME where to find the
product databases for a certain store. The Store.def MUST be
placed in the Osiris directory.
The Store.def file contains one line per store. This line
consists of TWO parts.
Part one is the NAME of the store, e.g. Walmart, and ENDS
with a comma.
Part two is the full drive and path to the directory, the one
you just created.
Sample:
Walmart,C:\Osiris\online
Did you notice the comma?
Osiris SE Technical Reference Manual Page 224
This is used to divide the store name from the path and
there should be NO spaces following the comma and the start
of the path to the store directory.
If you're going to have more than one store, add a line for
each store you add.
Make SURE you use a different sub-directory for EACH
INDIVIDUAL store.
e.g.
Walmart,C:\osiris\online
The Business Store,C:\Osiris\online2
Creating Proboard.qbs
Now you have to tell me how you are going to set up
the departments within your store. Do that by
creating a Proboard.Qbs file
The On-line Store uses DEPARTMENTS to group
products together. For example; Hard Drives,
Tape Drives, Disk Drives, are all like products and
would be grouped under one Department. We'll call
this department "Drives." Create a file called
proboard.INI and enter the following. Define Proboard
Vender: Your Company Name Name: Product Name Access
Level: Access Level Required to Enter this Department.
End Define
An Actual Entry would look something like this.
Define Proboard
Vender: Walmart
Name: Drives
Access Level: 1
End Define
You can use the access levels to setup WholeSale,
Retail, preferred customer areas, etc.
Each Proboard definition is an actual Database. The
database numbering would be on a first come, first serve
bases.
The above example would reference database #1 or the
Drive Database. The department names are only visual
references so you can use the same "NAME:" definition
for more than one department.
Osiris SE Technical Reference Manual Page 225
Sample
Define Proboard
Vender: The Business Store
Name: Systems
access level: 1
End Define
Define Proboard
Vender: The Business Store
Name: Monitors
access level: 1
End Define
Define Proboard
Name: Printers
access level: 1
Vender: The Business Store
End Define
Define Proboard
Name: Assessors
access level: 1
Vender: The Business Store
End Define
Define Proboard
Name: Books
access level: 1
Vender: The Business Store
End Define
Define Proboard
Name: CDROM
access level: 1
Vender: The Business Store
End Define
Osiris SE Technical Reference Manual Page 226
Once you've completed the proboard.ini file, you
have to compile it. Use the MAGCFG option in OSM. Once
the proboard.qbs file has been created, move it to the
directory you defined in the store.def file.
Other stores will require their own proboard.qbs.
The owners of those stores should provide you with
copies of their proboard.qbs.
Product Database Storage Structures
Each database is broken into two files, HPDxxx.DAT
and TPDxxx.DAT. The first holds most of the
information for each product listed in that
department except for the description field. The
description field is held in a TPDxxx.dat file
that allows variable length records. This reduces the
amount of disk space required to store the
products and allows fast record retrieval by using
FIXED length records via the HPDxxx.DAT structure.
Product Definitions
Now here comes the really hard part, defining the
actual STORE databases. You do this by creating
dpXXXX.TXT files containing a text formatted list of
all the products for that department. Take each
proboard department in the order you've defined them,
this is important. When you build the DPxxxx.TXT files
they will be associated with the Departments defined in
the same order.
ie . . . for the DRIVES department, used in the
first example, use DP0001.TXT.
Each product is in the department is defined by starting
the definition with "Define Item."
Each product definition is ended with "End Define"
Define Item
*
*
End Define
The information about the product is contained within
these two fields.
Osiris SE Technical Reference Manual Page 227
Each product definition should define the following
fields, order within the definition doesn't matter.
Name: "name of the product"
Catalog Number: "For your information, something to
reference"
Price: "Unit price for product"
Weight: "Shipping weight, if applied"
Description "A description of the product."
Payment Method: "Method of payment you'll allow when
ordering"
Order Form: "Name of the customized order form, do not use
any extensions.".
(NOTE that each field name ends with a COLON ':')
Maximum Field Lengths
Name - 40 Characters
Price - 10 Characters
Weight- 10 Characters
Payment Method - 40 Characters
Catalog Number - 10 Characters
Order Form - 8 Characters
Description Field - 1,000,000 Characters
The field definitions are fairly straight forward
except the description field.
Description Field
To define the description field use "Begin
Description". It should be the only item on that
line.
To END the description definition, use "End
Description"
The text between these two lines will be
used as the product's description field.
The individual description LINES
themselves should be no longer than 65
characters each.
Osiris SE Technical Reference Manual Page 228
Example
Begin Description
High speed mailer system with HTMS, Wazoo, FSC001, Sealink
mail Sessions. 10 definable Alt-Fkey and 20 shift/ctl Keys.
400 definable events, Flash Packing, Dynamic Events, on the
fly event redefinition, color configurable. Safety catches
for Bad calls, busy time out counters per event, Multiple
FREQ restriction settings per individual events.
End Description
Example 2
Example of an entire Product Definition within a
DPxxxx.TXT file;
Define Item
Store: Micro TECH Systems
Name: ISIS Rev 2.14
Catalog Number: MTS01L
Price: 79.95
;Weight:
Begin Description
High speed mailer system with HTMS, Wazoo, FSC001, Sealink
mail Sessions. 10 definable Alt-Fkey and 20 shift/ctl Keys.
400 definable events, Flash Packing, Dynamic Events, on the
fly event redefinition, color configurable. Safety catches
for Bad calls, Busy time out counters per event, Multiple
FREQ restriction settings per individual events.
End Description
Payment Method: Master Card or Visa
Order Form: ORDER2
End Define
If a particular field doesn't apply or isn't used
for that product, leave it out or comment it out
by starting the line with a semi-colon.
You can have up to 32,722 individual items
listed per department. Just define each item as
outlined above.
WARNING
Do NOT alter the FIELD designators 'Store:'
by adding spaces in an attempt to "PRETTY" up the
display.
'STORE:' works while 'STORE :' will NOT
work.
Osiris SE Technical Reference Manual Page 229
Once you've finished the product definition list
for a particular department, list that filename
in a file called "MAGDB.CFG."
e.g. for the FIRST listing . . .
Copy con magdb.cfg
DP0001.TXT
^Z<RETURN>
The MAGDB.CFG is used by the product database
compiler. It reads the magdb.cfg file to obtain
the names of the department product lists.
Continue building the rest of your department product
lists and adding each list to the MAGDB.CFG file.
One you've completed this, you'll have a MAGDB.CFG that
looks something like this, assuming 10 departments.
DP0001.TXT
DP0002.TXT
DP0003.TXT
DP0004.TXT
DP0005.TXT
DP0006.TXT
DP0007.TXT
DP0008.TXT
DP0009.TXT
DP0010.TXT
By doing it this way, you can come up with any naming
scheme that suits you. I think the above make sense,
but individual preferences . . .
Once you've completed the product definitions for all
the departments and have the individual files
listed in MAGDB.CFG, you're going to
compile them into department databases.
Use the MAGDB option in OSM. This can take awhile if
you've a lot of products.
You're done with the DPxxxx.TXT files so use some
type of archive program, Pkzip, to archive them away
until you need to make any changes.
When it is time to make those changes, you can use
your word processors pattern matching
Search/Replace features to quickly edit the items
that need changing.
Osiris SE Technical Reference Manual Page 230
Your final set would be to go to OSM and select the
command keys for each store function and then create a
menu for full help display.
When you select the command keys, do NOT skip any
option on the menu. You MUST define something, even if
you do NOT want to use it.
If you do NOT want to use an option, set the command key
to a numeric character, 0 - 9.
The name of the full help menu is "PROMENU.OJB/ANS." A
demo menu is included.
Each store has two optional *.ASC/ANS/MMU files, INFxxx
and BULxxxx. "xxxx" is the stores number, directly
references the position in the proboard.qbs.
INF is an information file and it can or should
contain information about the store. Who owns it,
operating hours, voice phone numbers, etc.
BUL is the store's bulletin file. It can contain
anything. The SPL/I commands supported in both files.
You have an intro display file called SINTRO. A default
one is included.
The display of available stores is controlled by
you. Osiris will displays a TEXT file called SLIST.
The stores are numbered, starting with 1, in the order
they are listed in the STORE.DEF file. A sample
SLIST is included.
Error In Osm
In the store menu option, the command "Search For Item"
should actual read "Open", meaning it does nothing at
this time.
Search All Departments
This feature searches the PRODUCT name field and does
not allow you to search the product description. With
the possibility of hundreds of thousands of items, it
would be TO time consuming to search the description
fields on all items.
Osiris SE Technical Reference Manual Page 231
Imx Osiris Se Frontend
IMX is the stand alone module for Osiris. Its primary job is
to answer the phone and call Orisis.
IMX requires 3 command line parameters;
-B BaudRate
-P Com_Port (1-8)
-N Node_number (1-255)
e.g. IMX -B2400 -P2 -N1
Optional Command Line Switches
/X, EXIT with errorlevel 1 if a human calls. This
overrides the default VMS shell.
I'll write a control file called RUNBBSx.Bat with x
being the node number passed on the IMX command
line.
e.g. /N1 will result in RUNBBS1.BAT being created.
The contents of RUNBBSx.BAT is one line . . .
HUMANx BAUD_RATE COM_PORT TIME_TILL_NEXT_EVENT
x being the node number passed on the IMX command
line.
This lets you run multiple nodes from the same
directory.
/Mxxxxxx, refers to a MODEM IN string used to force
the modem to answer the phone rather than using the
S0 register or auto-answer. The xxxxx is the string
to send to the modem to force it to answer.
Generally this is ATA on most Hayes compatible
modems.
Warning
In order for this to work, your modem must be
set up so it DOESN'T AUTO-ANSWER.
Most modems will abort an auto-answer if you
send them ANYTHING during the answer process.
Osiris SE Technical Reference Manual Page 232
/Dtr means do NOT use the modem busy string as
defined but simply drop DTR when exiting. This
means the modem will NOT be able to answer the
phone.
/Hot means leave the modem AS IS when exiting. I
don't recommend using this switch.
Sample Batch
Example of a Frontend batch file to run IMX for Node 1
using EXIT errorlevel on Human caller.
:TOP
imx -B 9600 -P 2 -N 1 -M ATA -X
if errorlevel 255 goto end
if errorlevel 1 goto caller
goto TOP
:caller
runbbs1
:end
Your RUNBBS1.BAT file will contain:
human1 9600 2 197
^------^------ will vary
human1.bat could look something like:
osiris -B%1 -P%2 -T%3 -N1
rem load frontend batch file.
port1
Shellxx.cfg
You'll also be required to build a SHELLxx.CFG file. xx
is the node number you provided on the IMX command line.
This file contains command line parameters you
want passed to Osiris. You should NOT include : -B, -P,
-N, or -T. I will provide those for you.
IMX, by default, does NOT exit when it calls Osiris but
uses the Virtual Memory System to SHELL to Osiris.
IMX will shift to EMS memory if you have it or to DISK
if you do not. You'll have all your original system
memory for Osiris to run in, except 5.5K.
Osiris SE Technical Reference Manual Page 233
Mdm Control File
You need to create a modem control file for IMX.
Select the MDM option in OSM to build a modem control
file for IMX. OSM will explain about the information
it requires you to supply.
Modem Initialization String
This can be tricky, especially if you have no prior
mailer or bbs experience and unfortunately
there isn't much I can do to help you with it.
There are hundreds of different brands of
modems. And each one of those modems has a
number of hardware dip switch settings that
can further complicate matters.
About the best advise I can give you is set the
modem so that it does not echo commands, uses
verbose return codes, and auto-answers.
With most Hayes compatible, command set, you would
use something like:
ATH0M0V1E0S0=1
Your modem may require addition or even totally
different commands. You'll just have to read the
manual that came with your modem.
Ok Return Code
IMX requires that your modem return OK when it
sends the modem initilization string. If your
modem ECHOS any part of the modem string, OK will
NOT be returned. If this happens IMX will exit to
DOS with errorlevel 252. Check your CBISx.log and
if you do not see MODEM : <OK> then you KNOW
this was the reason.
The next step is to setup an event file for IMX.
Events
IMX can support up to 400 defined operating events
in Stand Alone mode.
An EVENT is used to tell me that you need to exit
to your batch file at a certain time to perform an
external operation.
Osiris SE Technical Reference Manual Page 234
Even if you do NOT want to exit to do anything, I
still to have events defined to cover each day of the
week and to cover all 1440 minutes of the day.
You use the EVENT.INI (Default Event.ini included)
file to define, edit, delete, or view events you've
defined.
Since IMX isn't a mail system, you only define : Exit
Errorlevel Starting Time Ending Time Day(s) of week
Exit Errorlevel
Exit with this errorlevel the first time it
runs that event for the day. Valid
errorlevels range from 1 - 255.
NOTE: You should avoid using errorlevels greater
than 250 or lower than 10 so you don't conflict
with internal errorlevels.
If you don't want the event to exit with an
errorlevel, enter a 0 (Zero) for the errorlevel.
Starting Time
The time of day the event starts. The time is in
military format, 10 PM = 22:00. Legal starting
times range from 00:00 to 23:59.
Ending Time
The time of day the event will end. The time is
in military format, 10 PM = 22:00.
Legal ending times range from 00:01 to 24:00.
Day Of Week
WHICH day(s) that event is to run on.
Legal Day of week Verbs Are:
MON TUE WED THU FRI SAT SUN ALL WEEKEND
You may stack as many as you need on one line.
Osiris SE Technical Reference Manual Page 235
Run Event on MON TUE FRI SAT
or
Run Event on ALL
or
Run Event on WEEKEND
NOTE: No single event may span midnight. You must
end the event at 24:00 and start a new one at
00:00.
NOTE: Although IMX will only run an event one
time per day, you should remain OUTSIDE in your
batch file for at least 60 seconds for the
MIDNIGHT event.
MIDNIGHT event being defined as the event that
starts at 00:00. All other events can return as
quickly as possible.
Nothing BAD will happen if you don't. It'll
not EXIT again, but it will continually load
the event (00:00) until 00:01 rolls around.
You need to COMPILE the EVENT.INI before I can use it.
Use the EVENT.EXE program for this. Just run it without
any command line switches.
It will generate an Event.Bbs file which contains
your compiled event.ini.
You can't directly use the Event.Bbs without first
renaming it. I will look for the file EVENTxxx.BBS with
xxx being the NODE number you passed on the command
line.
e.g. Node 1 -> Event1.Bbs, Node 2 -> Event2.Bbs.
This allows you to define DIFFERENT events for each
node, if you're running more than one.
Osiris SE Technical Reference Manual Page 236
Modems, In General
IMX is set up to work with GENERIC modems.
Supported CONNECT codes:
Connect 19200
Connect 14400
Connect 12000
Connect 9600
Connect FAST
Connect 2400
Connect 1200
Connect
IMX also supports EXTENDED result codes like Connect
9600/REL or CONNECT 14400/ARQ/V32 or almost any thing
else you can think of. I can do that by IGNORING
everything PASS the numeric, ie. 9600 or 14400, part of
the message.
You WILL run into a problem if you have a cheaper 9600
baud modem that always returns the LOCKED rate PLUS
the connect rate.
e.g. CONNECT 19200/2400
If you have one of those, you'll need to get ahold of an
advanced mailer that is HIGHLY configurable and lets you
DEFINE odd ball result codes. ISIS is one that can
handle something like that.
Overlays
I do make extensive use of "OVERLAYS," an Overlay contains
part of the program that ONLY loads into memory when you need
it.
That means there _CAN_ be .05 second delay between the time
you select an option and that option executes. But .05
seconds would, in most cases, not be noticeable.
Earlier, I said Osiris needs 450K to run. Actually, I only
NEED 185K to load the program and it is possible to run it in
256K, minus archive support, games, Statistics System, Osage,
and several other external applications.
Lim/Extended Memory
If you have LIM 4.0, EEMS 3.2, or Extended Memory, I'll
automatically load the overlays into that section of
memory. That means the entire program is in memory and I
don't have to load overlays from your disk.
Osiris SE Technical Reference Manual Page 237
Vms Overlays
I use two special VMS overlays, one for the Statistics
System and one for Osage.
A VMS overlay is different from your regular overlay
because it doesn't RESERVE any OVERLAY space.
Instead of reserving space, I'll use part of the
programs memory, after swapping it to disk or LIM
memory. That greatly reduces the amount of memory needed
to run the program.
Lock-Ups
If you have LIM 4.0 or EEMS 3.2 memory and you're
locking up when loading the Statistics System or
Osage, you may need to adjust the Overlay memory to
fit your system.
The default is 256K, which is more than enough for
the Statistics System or Osage and will work just
fine on 95 percent of the systems.
But, no two systems are exactly alike and your
memory layout may require you to fine tune the VMS
overlays.
If it locks, I would suggest that you start with
384 and go up in 10K blocks. Under some conditions,
you may be able to start at 384 and go DOWN in 10K
blocks.
E.g., Vetlink #3 will lock if set to 400, but will
work just fine with the default 256.
You can make the adjustments by using the command
line switches, /Oxxx and /Sxxx. xxx is the amount
of memory you want.
Speed Tips
A super fast BBS does not have to have the latest and
greatest Super Computer. A fast BBS can be set-up on a 10 Mzh
AT.
If it is set-up correctly, your callers will think you have a
20 Mzh 80386 instead of a 10 Mzh AT.
Lim 4.0
Install at least 2 Meg of LIM 4.0 memory, 4 Meg for
Optimum results.
Osiris SE Technical Reference Manual Page 238
Cache
Set-up a 128K disk cache. I suggest an EXTENDED or LIM
memory cache.
640K Extender
There are several public domain Dos Extenders that will
map 64K of LIM 4.0 memory to DOS giving you 64K more
conventional memory that you would normally have.
This means VMS memory swaps for protocols, archivers,
and games SHELLS will have to swap LESS memory to give
you want you need and LESS means faster.
Asc/Mmu/Ans Files
Create a RAM Disk and place your ASC, MMU and ANS files
on the RAM disk, don't forget to tell me which directory
to use!
I'll be loading and displaying menus and other display
files more often than any thing else and if I can do it
from a RAM disk, then the file is basically already
LOADED. Since most disk caches do not cache RAM disks,
that leaves more DISK based data in your Cache.
Ovl01818 And Ovl01819
Move those files to your RAM disk and add a PATH=
statement, pointing to THAT directory.
Make it the FIRST one in the path statement so
I'll look there, FIRST, before looking in your other
PATH= directories.
Important, make SURE you do NOT have ovl01818 and
ovl01819 in your OSIRIS ROOT directory.
Mono-Graphics Adapter
Do not use a COLOR monitor on your BBS machine. Color
Adapters are a lot slower than MONO. Using a MONO card
on the BBS can REALLY speed things up.
16650 Uart
Install a 16550 high speed Uart on your serial card.
Osiris SE Technical Reference Manual Page 239
Fast Harddrive
No, you don't have to go out and buy a fast hard drive.
If you follow the other suggestions, a 40 MLS HD will be
fast enough.
Scsi
Although SCSI drives are fine for file areas, they
do tend to operate a bit slower than other drive
types when it comes to small or medium disk writes.
This makes them unsuitable for use as the PRIMARY
drive for the BBS software and the message bases,
especially if you are handling large volumes of
echomail.
We're really not SURE why they tend to be slower,
but Osiris sysops report 286 machines with ESDI or
IDE drives blowing the doors off 386 and 486
machines with SCSI drives during echomail import
and export.
Tsr/Device Drivers
Get rid of all TSRs or Device drivers that you do not
absolutely have to have to run the computer, they steal
interrupt time.
Small Partitions
Keep your hard drive partitions as small as possible, no
larger than 30 Meg, 20 is better. The smaller partitions
are just plain faster. If you HAVE to have larger
partitions, make sure you only use them to store
DOWNLOAD files.
Memory Manager
The TYPE or brand of memory manager you use and how you
set it up can have a direct impact on system
performance.
Qemm
QEMM is a nice manager with lots of features, but
it does severely degrade system performance in the
areas of disk access and screen writes, as much as
25 percent in some cases. I would advise that you
switch your memory manager to 386MAX if at all
possible.
Osiris SE Technical Reference Manual Page 240
Steath
QEMM has a STEATH option, do NOT use it.
Although you will pickup a few K of
conventional memory, this is offset by a LARGE
decrease in system performance.
386Max
386MAX is the memory manager we recommend for
optimal system performance and reliability.
Using 386MAX will not degrade disk access, in
fact it will increase the data transfer rate,
nor will it have any impact on screen writes.
386MAX is also considered to be the most reliable
memory manager you can use and it is Window and
DESQview compatible.
Almost all the Osiris sysops that switched from
QEMM to 386MAX reported their computers ran an
average of twenty-five percent faster.
Loadhi
Do NOT LOADHI any application, system driver, TSR that
will repeatedly be accessed such as ANSI drivers,
DISKCACHES, BIOS, etc.
Although LOADHI will increase your conventional memory,
it will degrade, drastically, system performance.
An alternate method is to use a DOS extender that adds
64K to conventional memory. This generally gives you
more conventional memory than LOADING HIGH and it, for
some reason, doesn't degrade system performance. Vetlink
III, 1-314-334-6359 has several PD DOS extenders
available for downloading.
Osiris SE Technical Reference Manual Page 241
21St Century Bbsing
BBS' of the future will in no way, shape, or form resembles
the way we do things now.
With everyone concerned with "TIME" and "PERSONAL
CONVENIENCE," they simply will not tolerate having to set in
front of a computer while the terminal program dials the BBS,
having to actual log-on to a BBS, or other wise being
"THERE" during the whole process.
Osiris 4.00+, TNT 6.00+, and ISIS 6.00+ combine together to
bring 21st Century BBSing to the 20th Century.
If you have our high-speed mailer, ISIS, and install the TNT
utilities on your BBS, your callers can access all the major
BBS operations; Reading/Replying to messages, downloading,
uploading, new file lists, global file lists, getting BBS
statistics (today's callers, yesterday's callers, best times
to call, etc.), user lists, adding/removing message areas,
etc. without having to log-on, unattended, and at a far
greater speed and in less time than normal.
Your callers Reading and Replying to messages on their
computer with an editor similar to Sphinx with full mouse
support, graphics, quoting, and other items.
They just tell TNT, by clicking on options, what they want,
when to start calling, and they can go shopping, play with
the kids, eat dinner, take a shower, or anything else they
want and TNT will take care of everything else.
TNT gives your callers more control over their personal FREE
time.
Remote TNTing provides full security, including virus
scanning, automatically moving uploads into proper
directories, updating file listings, giving the remote TNT
person credit for uploading.
The same holds true for downloading.
In fact, all the normal BBS restrictions, security aspects,
and safe guards apply to remote TNT.
Not only does TNT give your callers 21st Century
capabilities, it also means you can handle MORE calls PER
LINE.
The average TNT session, to retrieve messages, last less than
2 minutes and in a lot of cases, less than one minute.
Osiris SE Technical Reference Manual Page 242
TNT also takes the INSTALLATION and OPERATION into the 21st
Century.
TNT, remote end, takes less than 2 minutes to setup and use.
YOU can install it on your end in less than a minute.
Download the TNT A and B archives for FULL details. We
provide TNT, Sysop Disk, FREE of charge.
Overlay Caching
Osiris will automatically allocate either an EMS/LIM 4.00
cache, Extended Memory Cache, or Conventional Memory Cache,
to store OVERLAYS.
The type of cache; EMS, EXTENDED, or Conventional will be
determined on a first come bases. I'll check for EMS first,
Extended second, and finally I'll use a small part of
conventional memory if all else fails.
This does three things . . .
First it makes your disk cache, if you are running one, much
more effective by freeing it from caching overlay requests.
Second, the entire program runs faster because it's ALL
loaded into memory and overlays do not have to be read from
the disk.
And third, it reduces file SERVER demands by keeping the
overlay in memory instead of reading it from the server.
Price
The Price of Osiris SE depends on the number of LINES you're
wanting to run.
No. of Lines Price
1 ............................................ 119.95
2 ............................................ 179.95
4 ............................................ 269.93
8 ............................................ 403.75
16 ............................................ 600.16
32 ............................................ 1200.00
64 ............................................ 2400.00
128 ............................................ 3800.00
256 ............................................ 5000.00
Each License is for one specific computer or LAN network.
Osiris SE Technical Reference Manual Page 243
Upgrading
Upgrading To Newer Versions
We generally produce a new version every 12 to 16
months.
Upgrade Price Chart
No. of Lines Price
1 50.00
2 60.00
4 80.00
8 120.00
16 200.00
32 360.00
64 680.00
128 1320.00
255 2590.00
Bug fixes, when needed, are provided free to anyone
that wants to download the fix.
A bug fix can be identified by looking at the last
two digits in the version number, X.YY. If .YY is
greater than 00, that is a bug fix.
A NEW version can be identified by the first digit,
X.
Important Information
New versions often bring desirable added functions
or performance. But, you should stop and
ask yourself if the upgrade is really necessary.
If you fail to do that and upgrade just for the
sake of upgrading, you are likely to create more
tangible benefits for us, we will gladly accept
your money, than for yourself.
Upgrading To Multiple Lines Or Adding More Lines
I'm fairly liberal on upgrading from a single node
version to a multiple node version, just pay the
difference between what you HAVE and what you WANT.
Lost Or Damaged Keys
Should you lose your key, I will provide ONE additional key
at no charge. There will be a five dollar handling charge for
any replacement keys after that. Since it takes less than a
minute to store the key archive on a backup disk, this should
rarely happen.
Osiris SE Technical Reference Manual Page 244
Bug Reports
I am sure there are a few bugs in Osiris, no programmer is
perfect, I know none of ours are, and no program is totally
bug free.
If you find a bug, PLEASE report it. You'll find a BUG.FRM
form included in the archive. Make use of it.
Suggestions
If you have a suggestion for a new feature or program you
would like to see added to Osiris, I would like to hear
about it. Just fill out the sug.frm send mail to:
International TeleCommunications
555 North Spring, No.39
Cape Girardeau, Missouri 63701
United States of America
Help
If you need help, you can use the Bbs, Vetlink III, at 1-314-
334-6359. This is an unmanned system and the sysop picks up
mail once a day. Please give him 48 hours to answer your
question. He does not pickup mail on weekends or holidays.
There is a mailer on Vetlink III, but it is used for Remote
TNT and Echomail. Do not attempt to send matrix mail or file
attaches, no one will see them.
ITC maintains a Voice technical support line at 1-314-335-
5384. The line is manned between 10 Am and 4 Pm Monday
through Friday, Central Standard Time. This is the FASTEST
method and the ONLY one we have direct control over.
Busy
This is a RING THOUGHT System. In other words, if the
line is busy, it will switch to an alternate extension.
So if the primary line is tied up, you will not get a
busy signal, it will just not answer (unless you're
lucky and someone else is available to answer).
Osiris SE Technical Reference Manual Page 245
Exceptional Important, Must Read!
International TeleCommunciations and VETLINK III will be
moving to a new location, about 100 miles south of our
current location, in or around Sept. 1992. If you call
our voice number or the BBS and get a "Number Has Been
Disconnected" recording and the phone company screws up
and fails to give you the new phone number, it has
happened before, call 1-314-785-7868 and ask what the
new number is.
These people have be kind enough to offer to give out
the new number.
They are not employee of International
TeleCommunications, know NOTHING about Osiris, in fact
they don't even own a computer so do not bother them
unless you get the "Number Has Been Disconnected"
message.
Osiris SE Technical Reference Manual Page 246
Spl/I
Copyright Notice
SPL/I is the proprietary property of International
TeleCommunications, protected under U.S copyright law,
international treaty provisions, and trade secret laws of
general applicability. Cloning or Duplicating, in part or
whole is prohibited.
Spl/I Verses Itp
Things have really changed in the language department.
The original concept was to create a very high level
language that would take most of the "programming" work
out of it. But, as more people began to use ITP, they
began to demand more and more from it.
It soon became clear that we were going to have to
create a new lower language in order to meet the needs
of the ITP users.
In the land of programming, low and high have different
means. A HIGH level language is one where a single
command does a LOT. A LOW level language means you a
become more involved in what is done, this sometimes
requires more steps but you have more control over what
is going on.
ITP was akin to the COBOL programming language. A single
command could do a whole lot, but if you needed
something a little different, you may not be able to do
it or you would have to TRICK the system into doing it.
The TRICKING part could be very hard to pull off.
SPL/I is a cross between 'C', PASCAL, COBOL, and BASIC.
In some areas it is very high level, databases and some
internal Osiris functions. In other areas it is very low
level, Input/Output, conditional testing, controlled
looping, and variables.
But with the higher degree of control comes more
responsibility. With ITP, if you mess up the worse that
could happen was the screen display would mess up or it
didn't do what you wanted it to do.
Moving to a lower level language now means if you mess
up, you stand a good chance of locking the computer up.
That's something 'C' programmers are very familiar with.
If I don't lock a computer up a couple of dozen times a
day, I know I'm not DOING much work.
Osiris SE Technical Reference Manual Page 247
Don't Be Overwhelmed
Your first reaction, as you read this, is "oh my
god!". Don't let it overwhelm you, it looks a LOT
harder than it actual is. Start out slow, with
small programs, and within a few weeks you'll be
doing things you never thought were possible.
Introduction
SPL/I programs work with data. We feed numbers, letters,
and words to the program and we expect it to do
something with the data.
The next several pages will concentrate on data
concepts and properties. Following that, we'll pounce on
some data and see what we can do.
The main topic of this section will be the three great
families of data CLASSES: integer, String, and real.
We'll learn what the CLASSES are, how to declare them,
how to use them, and when to use them. We'll also
discuss the difference between constants and variables.
Data: Variables And Constants
SPL/I can do many things. It can add numbers, beep the
speaker, display output to the video screen and serial
port, calculate cometary orbits, prepare a mailing list,
manage btree databases, multiple level conditional
testing, create/read/write disk files, draw stick
figures, or do whatever else your imagination can
create. To do these tasks, it needs to work with DATA,
the numbers and characters that bear the information you
use.
The difference between variables and constants is pretty
obvious: a variable can have its value assigned or
changed while the program is running, a constant can't.
A variable does not disappear once you use it, a
constant does.
A constant is only kept until the current SPL/I command
has been processed. After the command has been
processed, the space or memory occupied by the constant
is released. The only exception to the this rule is the
predefined variable constants.
Those are predefined SPL/I variables that you can
access, but you may not change.
Osiris SE Technical Reference Manual Page 248
E.g., Joe
This is a variable you have defined, its value can be
assigned and it can be changed.
E.g., _NAME
This is constant. Its value was assigned by SPL/I and
you may not change it. _NAME, by the way, is a string
constant and contains the name of the current caller.
E.g., 2356
This is a constant, Its was declared by you, but it
cannot be changed.
E.g., 50000U
This is a constant, Its was declared by you, but it
cannot be changed.
E.g., "THIS IS A TEST"
This is a STRING, denoted by the double quotes,
constant. You defined it, but it cannot be changed.
A character constant MUST encase it with single quotes,
i.e., 'A' or '2', I.e., _ASSIGN(CH,'A');
Data Classes
Beyond the distinction between variable and constant is
the distinction between different types of data. Some
data are numbers. Some are letters, or, more generally,
characters. Throughput this document, the data's type
will be referred to as the CLASS. If CH was declared as
an integer, its CLASS would be integer.
A variable needs to have its CLASS announced in a
declaration statement. I'll fill you in on the details
as we move along. First, though, let's look at the
fundamental CLASSES recognized by SPL/I. SPL/I uses
eight keywords to set up data CLASSES. Here are those
keywords:
Integer
Unsigned_Integer
Long
Unsigned_Long
Real
Character
String(size)
File
Osiris SE Technical Reference Manual Page 249
The integer keyword provides the basic class of integers
used in SPL/I. The next three keywords
(Unsigned_Integer, Long, and Unsigned_Long) are used to
provide variations of the INTEGER CLASS; we'll discuss
their use soon. Character is for letters of the alphabet
and for other characters, such as #,$, %, and &. The
Real keyword represent numbers with decimal points. The
keyword String(size) represents a GROUP of characters.
The number of characters is defined by the size.
E.g., String(80) defines a group of up to 80 characters.
Integer CLASSES? Real CLASSES? If you find these terms
disturbingly unfamiliar, be assured that I'm about to
give you a brief run-down on their meanings.
For a human, the difference between an integer and a
real number is reflected in the way they can be written.
For the computer, the difference is reflected in the way
they are stored. Let's take a look.
Integer
The integer is a whole number. It never has a
fractional part, and in SPL/I it is never written
with a decimal point. 2, -23, 2456 are integers
while 3.99, 122.1, 2/3, and 999999.99 are not
integers.
Integers allows a range in values from -32768 to
+32768.
Unsigned_integer
An Unsigned_Integer is a whole number and is
basically like its brother the integer.
The difference between the two; the range in
values. The integer values range from negative
32768 to a positive 32768. An Unsigned_Integer
has a range in values from 0 to 65535, no
negative numbers.
Long
The long is the same as the integer except the
range of values is larger. It takes twice as
much memory to store a long and it is slower,
during arithmetic operations.
The long has a range in values from -
2,147,483,648 to 2,147,483,647.
Osiris SE Technical Reference Manual Page 250
Unsigned_long
The unsigned long is the same as the
UNSIGNED_INTEGER except the range of values is
larger. It takes twice as much memory to store
and it is slower during arithmetic operations.
The Unsigned_Long has a range in values from 0
to 4,294,967,295, no negative numbers allowed.
Real
Here are some real numbers: 2.71, 3.16E7, 7.00, and
2e-8. Obviously, there is more than one way to
write a real number. So SPL/I requires you to write
all REAL numbers in the format xxxxxxx.yyyyy or
123348.1124321. 3.16E7 and 2e-8 are not supported
under SPL/I.
The key point is the scheme used to store a real
number is different from the one used to store an
integer. Real number representation involves
breaking up a number into a fractional part and an
exponent part and storing the parts separately.
Thus, the 7.00 would not be stored in the same
manner as the integer 7, even though both have the
same value. Here "0.7" is the fractional part, and
the "1" is the exponent part. SPL/I would use
binary numbers and powers of two instead of 10 for
internal storage. YOu don't have to worry about the
mechanics of real storage, I'll handle that. You do
need to be aware of it, you'll find out why later
on.
Lets concentrate on the practical differences:
1. Integers are whole numbers, while real number
can represent both whole and fractional numbers.
2. Real numbers can represent a much large range of
values than integers.
3. For arithmetic operations, real numbers are
subject to greater loss of precision.
4. Real operations are slower than integer
operations.
5. Integers take two to four bytes of memory to
store, REAL numbers take 8 bytes of memory.
Osiris SE Technical Reference Manual Page 251
Intermixing Data Classes
The 'C' programming language does allow you to intermix
data CLASSES during arithmetic operations and compare
statements. However, comparing or doing arithmetic
operations on different CLASSES can lead to unexpected
results. A professional programmer knows, or should, how
to manage intermixed CLASSES so he gets the desired
results. But, you are not a professional programmer and
we do not expect you to have the skill required to
manage intermixed CLASSES and I can't do it for you.
To prevent unexpected results, I've decided to follow
PASCALS (another popular programming language) lead and
all arithmetic operations and conditional testing
requires all the variables involved be in the same
CLASS.
In other words, you may not add an integer with a long,
both would have to be integers OR both would have to be
long.
Since I can't read your mind, the next best thing is to
provide a method of changing a variables CLASS and the
contents of the variable, the _CAST(variable,
New_Data_class) function.
You should be careful when using the _CAST function. You
can safely cast a variable UP to the next largest data
CLASS, but casting down to a smaller data CLASS can
sometimes cause the value to change if it is larger than
the new data CLASSES maximum size. See the section on
_CAST for further details.
Declaring An Integer Variable
The key word _DEFINE_VAR is used to declare variables.
First comes _DEFINE_VAR, the half-moon opening bracket,
the chosen name of the variable, a comma, the key word
INTEGER, the half-moon closing bracket, and a semicolon.
The following are valid declarations:
_Define_var(hogs,Integer);
_Define_var(cows,Integer);
_define_var(goats,Integer);
These declarations created variables, but they did not
provide values for them. They can pick up values in the
program.
Osiris SE Technical Reference Manual Page 252
Initializing A Variable
To initialize a variable means to assign it an initial
value. In SPL/I, this can be done with the function
_ASSIGN.
First comes _ASSIGN, the half-moon opening bracket, the
name of the variable, a comma, the value, the half-moon
closing bracket, and a semicolon. The value can be a
constant or it can be the name of another variable. If
it is the name of another variable, then the contents of
that variable is assign. The following are valid
assigns:
_Assign(hogs, 12);
_Assign(cows, 25);
_Assign(goats, hogs);
_Assign(MyName,"John Doe");
Although _ASSIGN is primarily used to initialize a
variable, it may be used to change the value of the
variable at any time.
Because _ASSIGN knows the DATA CLASS of the variable
you're assigning the value to, you do not have to add
the CLASS indicator to non-integer constants; Long,
Real, or Unsigned_Integer's.
If COW was declared as having a LONG data CLASS
_ASSIGN(COW, 256000);
would be valid.
_ASSIGN(COW, 256000L);
would also be valid but the trailing CLASS indicator
isn't required or used.
Integer Constants
The varies integers (21, 32, 14, and 94) are examples of
Integer constants. When you use a number constant in
SPL/I, SPL/I assumes it is an Integer constant, unless
an class indicator is used.
Take the constant 40000. SPL/I would attempt to fit that
into INTEGER format and the results would not be 40000.
40000 exceeds the maximum value an INTEGER can hold.
Osiris SE Technical Reference Manual Page 253
Constants that fall outside the classification of
INTEGER, those larger than 32768, must have a class
indicator.
In the prior example, 40000 will not fit in an INTEGER
but it can fit in an UNSIGNED_INTEGER. The constant
class indicator for an UNSIGNED_INTEGER is an upper case
U, i.e, 40000U.
Example:
_define_var(cows,LONG);
_if(cows < 50000);
_endif
This test would not be valid. cows is defined as a LONG
and 50000 was defined as an INTEGER constant. 50000
would also not be 50000 because it exceeds the maximum
value an INTEGER can hold.
_define_var(cows,LONG);
_if(cows < 50000L);
_endif
Would be valid because the constant 50000 has the LONG
class indicator, upper case L.
Constant Class Indicators are U for UNSIGNED_INTEGER and
L for LONG.
Even thou REAL is not a INTEGER or variation of the
INTEGER class, it also has a Constant Class Indicator,
R.
Examples
50000U UNSIGNED_INTEGER Constant
50000L Long Constant
50000R REAL Constant
Constant CLASS indicators ARE CASE SENSITIVE. l is NOT
the same as L, u is NOT the same as U.
Osiris SE Technical Reference Manual Page 254
Printing Variables And Constants
We'll use the _printf function to print the variables
and constants. The nature or format for using _printf
will be outlined later.
This is a complete SPL/I program:
_define_var(cows, Integer);
_define_var(name,string(40));
_assign(cows, 200);
_assign(name,"Bill");
_printf("%s, I've got %d cows for sale today.\n",name,cows);
Running this program would produce the output:
Bill, I've got 200 cows for sale today.
Printing LONG, UNSIGNED_LONG, REAL, UNSIGNED, CHARACTER,
and STRING is almost the same except the %<CLASS>
indicator is slightly different.
Use %l for LONG, %x for UNSIGNED_LONG, %r for REAL, %c
for CHARACTER, and %s for string. See section on _printf
for further details.
Character Class
The character CLASS is used for storing characters such
as letters and punctuation marks. The standard ASCII
code runs numerically from 0 to 127. This is small
enough to fix within the range limits of the character
CLASS. The IBM PC offers extended ASCII codes, but they
are within the range limits of the character CLASS.
As you might expect, character variables are declared in
the same manner as other variables. Here are some
examples:
_define_var( response, character);
_define_value(grade, character);
Using Strings
Example of a String: This is an example of a string.
A string is simply a GROUP of CHARACTERS linked together
so they can ALL be referenced with one variable.
Osiris SE Technical Reference Manual Page 255
In low level programming languages, the lower the level
the more control the programmer has, there isn't any
such thing as a STRING data CLASS.
In 'C', the programmer has to create a character array
if he wants to store multiple letters together.
But since the building and using of character arrays is
so common, SPL/I has taken over the grunt work of
creating characters arrays by giving you a special
STRING class.
Declaring A String Variable
The key word _DEFINE_VAR is used to declare string
variables. First comes _DEFINE_VAR, the half-moon
opening bracket, the chosen name of the variable, a
comma, the key word STRING, the half-moon opening
bracket, the maximum length of the string, the
half-moon closing bracket, half-moon closing
bracket, and a semicolon. The following are valid
declarations:
_define_var(name,string(80));
_define_var(City,string(40));
In the first define statement, the variable "NAME"
was declared as having the CLASS of string and the
size of the string, maximum number of characters
allowed, was set to 80.
In the 2nd define statement, the variable "CITY"
was declared as having a CLASS of string and the
size of the string was set to 40.
SPL/I does not do LENGTH CHECKING! If you assign a
value to the string variable it must be large
enough to hold all the characters.
Initializing A String Variable
To initialize a string variable means to assign it
an initial value. In SPL/I, this can be done with
the function _ASSIGN.
First comes _ASSIGN, the half-moon opening bracket,
the name of the variable, a comma, the value, the
half-moon closing bracket, and a semicolon. The
value can be a constant or it can be the name of
another variable. If it is the name of another
variable, then the contents of that variable is
assign. The following are valid assigns:
Osiris SE Technical Reference Manual Page 256
_ASSIGN(CITY,"CAPE GIRARDEAU, MO");
_ASSIGN(CITY,_CITY);
_ASSIGN(CITY,INPUT_STRING);
In the first assign statement, CITY was given the
value of
CAPE GIRARDEAU, MO
In the 2nd assign statement, CITY was given the
value of the SPL/I predefined variable _CITY. _CITY
holds the current callers CITY.
The 3rd assign statement assigns CITY the contents
of the string variable INPUT_STRING.
String Constants
A STRING constant is defined by encasing the string
in double quotes.
Example
"THIS IS A STRING"
The constant would be seen by SPL/I as : THIS IS A
STRING
The double quotes are not considered as part of the
string constant, they are used to define the
constants CLASS.
Example
_Define_var(Caller, String(40));
_assign(caller,_NAME);
_IF(caller = "JOHN DOE");
_ENDIF;
The program declares that Caller is a string
variable that can hold up to 40 characters.
Osiris SE Technical Reference Manual Page 257
It then assigns the contents of _NAME, a predefined
SPL/I variable that holds the current callers name,
to the variable Caller.
It then checks the variable caller to see if the
contents caller is equal to JOHN DOE. The _IF
statement uses a string constant to hold JOHN DOE.
Although the last examples works just fine, the
following would work better
_IF(_NAME = "JOHN DOE");
_ENDIF;
Instead of declaring a string variable, assign the
contents of _NAME to it, we just referenced _NAME
directly in the _IF statement.
Maximum Number Of Active Variables
SPL/I allows you to have a total of 100 active variables
defined. Once you have finished with a variable and it
isn't going to be used again, in the near future, the
variable should be freed back to the variable pool.
To free a variable, use the function _FREE_VAR. First
comes the keyword _FREE_VAR, the half-moon opening
bracket, the name of the variable, the half-moon closing
bracket, and a semicolon.
Examples
_free_var(cow);
_free_var(horse);
_free_var(first_name);
Warning: One thing the compiler cannot keep you from
doing is declaring a variable, freeing it and then
attempting to use the variable after you have freed it.
Make sure you do not use this variable after you have
freed it.
Variable Names
SPL/I is very flexible in respects to variable names.
They can be any combination of letters or numbers as
long as the first character of the name is a letter, A-
Z.
Osiris SE Technical Reference Manual Page 258
Variable names have a maximum length of 15 characters.
SPL/I does reserve the use of INTEGER, UNSIGNED_INTEGER,
LONG, UNSIGNED_LONG, CHARACTER, REAL, and FILE.
Attempting to use any one of the reserved names as a
variable name will fail.
Also, avoid using reserved names as PARTS of a
variable or procedure name. This can confuse the
compiler and produce undefined results.
E.g., BIG_INTEGER could cause problems because INTEGER
is a reserved name.
Predefined Variables
SPL/I has a number of PREDEFINED variables, some are
constants and may not be altered. Most of the predefined
variables deal with the user record.
The column marked as FIXED means that if YES appears in
the column, you many not alter the value of the
variable.
Osiris SE Technical Reference Manual Page 259
Variable Name Variable Type What it is Fixed
_Name STRING Callers Name Yes
_City STRING City
_Pwd STRING Password
_Phone STRING Phone No.
_Tcalls UNSIGNED_INTEGER Total Calls
_Fdate UNSIGNED_INTEGER Original Logon Date
PACKED DATE FIELD
_Ldate UNSIGNED_INTEGER Last Date Called
PACKED DATE FIELD
_Nrestrict INTEGER Node Restrictor
_Nldisplay INTEGER Nodelist Display
0 = No
1 = Yes
_Alias STRING Callers Alias Yes
_Scope STRING Scope SR#
_Buploads LONG Total Uploads(Bytes)
_Bdnloads LONG Total Dnloads(Bytes)
_Sclear INTEGER Screen Clear TYPE
1 = ANSI
2 = FF
3 = CR/LF
_Protocol_num INTEGER Protocol Record # Yes
_Lmread INTEGER Last Msg Read in
Message Center.
_Lmboard INTEGER Last conference
board visited.
_Lfboard INTEGER Last file board
visited.
_Bday INTEGER Birth DAY
_Bmonth INTEGER Birth MONTH
_Byear INTEGER Birth Year, 2 Digits
_Fdnloaded UNSIGNED_INTEGER Total Files Dnloaded
_Fuploaded UNSIGNED_INTEGER Total Files Uploaded
_Dntoday INTEGER Total Kilo-bytes
Dnloaded Today.
Osiris SE Technical Reference Manual Page 260
Variable Name Variable Type What it is Fixed
_Timeon INTEGER Total time logged for
today. Does not
include time for
current call.
_Mcredit INTEGER Matrix Credit
_Mposts INTEGER NO. of Conf. Msgs
Entered
_Ltime UNSIGNED_INTEGER Last TIME on-line.
PACKED TIME FIELD
_Access UNSIGNED_INTEGER Access Level
_Ibm INTEGER IBM Graphics
1 = YES
0 = NO
_Osage INTEGER Use OSAGE editor
1 = YES
0 = NO
_Slength INTEGER Screen Length
_Ansi INTEGER ANSI Graphics
1 = YES
0 = NO
_More INTEGER More prompt ON
1 = Yes
0 = No
_Help INTEGER Help Level
1 = Full Help
2 = Short Menu
3 = No Help
_Nconf INTEGER Conf. Mail Check
1 = Yes During LOGON.
0 = No
_Hotkey INTEGER Using HOTKEYS
0 = No
1 = Yes
_Tagprompt INTEGER Prompt for Dnload
0 = NO during New Uploads
1 = YES search.
_Rpwd UNSIGNED_INTEGER Rotate Password.
0 = No, Anything Else = NO. OF CALLS
Osiris SE Technical Reference Manual Page 261
Variable Name Variable Type What it is Fixed
_Newuploads INTEGER New Uploads Search
1 = Yes during log-in.
0 = NO
_Timeleft INTEGER Time left for call Yes
in Mins.
_Calltime INTEGER Time on-line for Yes
CURRENT call
_Brate INTEGER Current Baud Rate Yes
_Totalcalls LONG Total Calls to Yes
current node
_Tusers LONG Total Users listed Yes
in user.bbs
_Port INTEGER Current Serial Port Yes
_Node INTEGER Current Node Number Yes
_Farea# INTEGER Current File Area No. Yes
_Marea# INTEGER Current Msg Area No. Yes
_Farea_n STRING(40) File Area Name Yes
_Marea_n STRING(40) MSG Area Name Yes
_Lmsg INTEGER Low Message No. Yes
_Hmsg INTEGER High Message No. Yes
_Cmsg INTEGER Current Message No. Yes
_Gflag UNSIGNED_INTEGER General Purpose Flags Yes
_Vendor STRING(45) Product Vendor Yes
_Product STRING(45) Product Name Yes
_Catnum STRING(15) Catalog Yes
_Uprice REAL Product Unit Price Yes
_Terms STRING(45) Sales Terms Yes
_Lcname STRING(40) Last Callers Name Yes
_Lccity STRING(30) Last Callers City Yes
Restrictions
There are a couple of restrictions placed on WHERE
you can use a predefined variable.
You may only use predefined variables in test
expression (if, elseif, while, etc.). You may use a
predefined variable in an assign statement.
If you assign a value to the predefined variable,
the value you assign MUST be contained in another
variable. You may not assign a constant to a
predefined variable.
Osiris SE Technical Reference Manual Page 262
Those restrictions drastically speed up overall
performance and greatly reduces the size of
internal command processor.
Spl/I Command Format
SPL/I requires all commands start with the underscore
character and all commands have to end with a semicolon
and everything else is ignored.
The reason is error trapping. The compiler has a much
better chance of trapping bad commands, commands not
used properly, and other items that a language compiler
might otherwise miss.
Any 'C' programmer will tell you, it generally the
computer locking up that tells him that he did something
wrong and not the compiler.
We think this format will allow the COMPILER to do a
much better job when it comes to trapping things that
may lock up your computer.
All arguments used within a specific command must be
separated by at least one blank space.
E.g., _if(rtcode > 10)
^ ^
Blank spaces.
You may use UPPER case, LOWER case, or any combination
that suits you, SPL/I with treat them the same, with the
exception of strings constants and character constants.
Language Syntax
The SPL/I language syntax is a little different than 'C'
syntax. 'C' is fairly free flowing and lets you do
things almost any way you want. For example
Y = starting_value();
for(x = y ; x < 10 ; x++);
means the same as
for(x=starting_value();x<10;x++);
The second one LOOKS impressive, but.... the program
code generated by the 'C' compiler would be the same for
both. The first example is a bit easier to read.
Osiris SE Technical Reference Manual Page 263
In SPL/I, you would do
call starting_value(Y);
for(x = Y : < 10 : 1);
You could not do
for(x = call starting_value(Y) : < 10 : 1);
In 'C' you can do
printf("This test #%d\n",get_test_number());
you could also do it.
y = get_test_number();
printf("This is test #%d\n",y);
The first LOOKS impressive, but again, the compiler will
generate the same instructions for both.
With SPL/I, we're not going to allow that type of free
flow design for several reasons.
Microsoft and other companies that sell compilers are
not expected to help programmers when they have problems
debugging their code or trying to figure out HOW to make
a program do what they want.
We, on the other hand, expect to do quite a bit of that.
You are not programmers and we aren't going to treat you
as programmers.
Because we will be seeing a lot of SPL/I code, we want
it to be easy to read so we don't have to spend to much
time figuring out what it is you're attempt to do.
The other reason is compiler error trapping. With the
design more or less fixed, the compiler can do a lot
MORE in the way of error trapping than a traditional 'C'
compiler. See the section on ITLINK error codes, there
are a BUNCH of them.
Structure
SPL/I is a STRUCTURED language. Structured basically
means flow goes in one direction and there is generally
only one way out.
All SPL/I programs END with the word _MEND
Osiris SE Technical Reference Manual Page 264
Example
_MEND
When the SPL/I program starts, it will continue to run
the program until it hits the instruction _MEND. Hitting
_MEND is the ONLY way you may exit an SPL/I program.
Example
_DEFINE_VAR(NOT_DONE,INTEGER);
_ASSIGN(NOT_DONE,1);
_WHILE(NOT_DONE);
_WEND;
_MEND
This would be a typical SPL/I program when you want the
body of the program to execute more than once. The while
statement keeps the program running until you signal it
to stop by changing NOT_DONE to 0, the while conditional
test returns FALSE and the while loop terminates.
All SPL/I commands begin with the underscore character,
_. So does most C commands, but the compiler will add
the underscore for you. We'll require you to add it so
we can trap unknown commands, or those spelled wrong,
quicker.
All SPL/I commands must end with a semicolon, so do all
'C' commands, in most cases.
Any line that does not end with ; will be thrown out as
a comment line. The only exception is the underscore. If
the first character is an underscore, the line must end
with a semicolon. If it doesn't, the compiler will stop
with an error message.
'C' uses /* to start a comment and */ to end a comment.
I've seen a lot of 'C' programmers pulling their hair
out trying to find a misplaced /* or */ sequence.
Hopefully, my method of commenting will not cause those
types of problems.
Osiris SE Technical Reference Manual Page 265
'C' uses the { and } brackets to show the body of if,
while, if/else statements. Believe me, I've spent HOURS
trying to find a misplaced or missing bracket. It can be
very hard to spot a missing character when you're
looking at several thousand of them.
Other languages use BEGIN and END to show the bodies of
if and while. It is easier to spot a missing word, but
it has a drawback.
IF()
BEGIN
WHILE
BEGIN
END
END
That's not to hard to follow, but since END/BEGIN is
used for everything, it can be a tad difficult figuring
out if a specific END goes with an IF, FOR, or WHILE
since they all use the same BEGIN/END Symbols.
SPL/I uses a different 'END' type symbol for each
statement. IF uses ENDIF, ELSEIF uses EEND, WHILE uses
WEND, FOR uses FEND, SWITCH uses SEND, CASE use BREAK.
That should help when it comes to debugging a program.
It also helps the compiler when it is doing nesting
checks.
Procedures, Variable Types, And Order
Procedures
An SPL/I program is a collection of commands
grouped into procedures. A procedure as a
SUBROUTINE, separated from the other groups by the
keywords
_PROCEDURE(the procedures chosen name);
and
_PEND
"_PROCEDURE(the procedures chosen name);" marks the
beginning of the sub-routine and "_PEND" marks the
END of the sub-routine.
The instructions between these two statements would
belong TO this procedure and would only be executed
when the procedure is called, see the section _CALL
for an explanation on HOW to call a procedure.
Osiris SE Technical Reference Manual Page 266
_PROCEDURE(the procedures chosen name);
_PEND
would be your typical procedure with one exception.
The procedure known as MAIN. MAIN is defined FOR
you and this procedure starts with the first line
of code,line 1. Since all SPL/I programs will HAVE
this procedure, you do not have to define it, you
only have to mark the END of the procedure with the
_MEND command.
_define_var(name,string(80));
_assign(name,_name);
_printf("%s\n",name);
_mend;
This would be your typical SPL/I program that does
NOT use any procedures other than MAIN. Notice the
last statement in the program, _MEND. _MEND is ONLY
used to mark the end of MAIN.
You MUST use this to signal where the MAIN
procedure ends.
_define_var(name,string(80));
_assign(name,_name);
_call(printname);
_mend;
_procedure(printname);
_printf("%s\n",name);
_pend
This program has TWO procedures, MAIN and
PRINTNAME. You will notice that the 2nd procedure
begins AFTER the _MEND. It will ONLY be executed IF
it is CALLED. In this case, I did call it and the
output would be
The Sysop
providing the variable "name" contained "The
Sysop");
Osiris SE Technical Reference Manual Page 267
Example
_define_var(name,string(80));
_assign(name,_name);
_mend;
_procedure(printname);
_printf("%s\n",name);
_pend
This program uses TWO procedures, MAIN and
PRINTNAME. If you run it, the output would be
blank, there was no output because PRINTNAME was
never called!
Data Types
Not only does a variables have a CLASS, it also has
a TYPE. The variables TYPE is determined by WHERE
it was defined. SPL/I supports two TYPES of
variables, global and automatic.
Global
A global variable is one who's _define_var()
statement was placed in the MAIN procedure.
A global variable can be accessed from the
MAIN procedure and by other PROCEDURES, with
one exception and I'll explain that later.
Example
_define_var(cow,integer);
_define_var(goats,integer);
_MEND
Those were GLOBAL variables, they were defined
in the MAIN procedure.
Osiris SE Technical Reference Manual Page 268
Automatic
An automatic variable is one you defined in a
procedure OTHER THAN MAIN.
An automatic variable is different from a
GLOBAL variable in two ways: It can ONLY be
accessed by the procedure it was defined in
AND it will vanish as soon as you leave the
procedure.
Example
_define_var(cow,integer);
_define_var(goats,integer);
_call(addition);
_printf("The Total was : %d\n",total);
_mend;
_procedure(addition);
_define_var(total,integer);
_math(total = cow + goats);
_Pend;
In the example, "total" is an automatic
variable because it was defined inside the
procedure ADDITION. Goats and cows are both
GLOBAL variables because they were defined in
the MAIN procedure.
As soon as you exit from the procedure
ADDITION, total will disappear and the memory
used to store it will be freed.
The line "_printf("The Total was :
%d\n",total);" is ILLEGAL because total does
not exist!
"total" was defined in the procedure ADDITION,
it is an automatic variable and as far as MAIN
is concerned, it never existed.
Osiris SE Technical Reference Manual Page 269
Order
In the case of
_Define_var(COWS,INTEGER);
_MEND
_PROCEDURE(ADD);
_define_var(COWS,INTEGER);
_PEND;
In this example, I've defined COWS in the MAIN
procedure and I've also defined COWS in the ADD
procedure. Yes, this is legal and no it will NOT
destroy nor will it alter the contents of the COW
variable in MAIN.
What this WILL do is keep you from accessing the
GLOBAL variable "COWS" because you defined an
AUTOMATIC variable "COWS" inside this procedure. As
long as you are IN this procedure, any reference to
"COW" will reference the AUTOMATIC variable and not
the GLOBAL variable.
Osiris SE Technical Reference Manual Page 270
Summary
_++(X);
x : A user defined variable, INTEGER CLASS.
Description
The _++ function is a QUICK method of incrementing the
value of x by 1 and has very little overhead.
Example
See _COPY_CH for example of the possible uses of the _++
function.
Osiris SE Technical Reference Manual Page 271
Summary
_--(X);
x : A user defined variable, INTEGER CLASS.
Description
The _-- function is a QUICK method of decrement the
value of x by 1 and has very little overhead.
Example
The string variable name has the contents of "The
Sysop". The variable len is an INTEGER.
_strlen(name,len); {Place the length of name in len, 9}
_--(len);
_while(len > 0 .OR. len = 0);
_copy_ch(ch,name,len);
_putc(ch,name,len);
_--(len);
_wend;
Program terminates when the value in len reaches -1. the
output
posyS ehT
Purpose: Prints the contents of name in reverse.
Osiris SE Technical Reference Manual Page 272
Summary
_Atol(destination,source);
_Atoi(destination,source);
_Atof(destination,source);
destination : User defined variable
source : User defined variable, STRING CLASS
Description
The three functions; atol, atoi, and atof translate the
contents of STRING CLASS variables to either INTEGER,
LONG, or REAL numbers and place the resulting number in
the destination variable.
atol translates the contents of the string to a number
that will fit in a LONG CLASS variable. The variable
'destination' must be LONG CLASS.
atoi translates the contents of the string to a number
that will fit in an INTEGER CLASS variable. The variable
'destination' must be INTEGER CLASS.
atof translates the contents of the string to a number
that will fit in an REAL CLASS variable. The variable
'destination' must be REAL CLASS.
You may need to translate a string answer, one obtained
from the caller, into NUMBER format.
You COULD use the CAST function, but CAST not only
changes the CONTENTS of the variable, it also changes
the variables CLASS and you may not want that,
especially if you plan on reusing the string variable
later on. If you CAST it, then it would no longer BE a
string.
Osiris SE Technical Reference Manual Page 273
Example
_define_var(input,string(80));
_define_var(result,integer);
_define_var(l1,long);
_define_var(r1,real);
_cls();
_printf("Enter a number between 1 and 32000 ? ");
_gets(input,79);
_atoi(result,input);
_printf("\nYou entered %d (INTEGER CLASS) \n",result);
_atol(l1,input);
_printf("You entered %l (LONG CLASS)\n",l1);
_atof(r1,input);
_printf("You entered %r (REAL CLASS)\n",r1);
The output, assuming the caller entered 512.24:
You entered 512 (INTEGER CLASS)
You entered 512 (LONG CLASS)
You entered 512.24 (REAL CLASS)
Osiris SE Technical Reference Manual Page 274
Summary
_Call(procedure_name);
Description
This command is used to access other procedures, replace
PROCEDURE_NAME with the name of the procedure you want
to call.
As soon as you exit the procedure, you'll continue
executing the instructions directly after the _CALL
statement.
Example
_printf("This is the line before the call.\n");
_CALL(PRINT_THIS);
_printf("This is the line after the call.\n");
If the procedure "PRINT_THIS" contained the command
_printf("Inside the procedure.\n");
Then the output would look like
This is the line before the call.
Inside the procedure.
This is the line after the call.
Using CALL to invoke procedures is VERY fast.
Example
_printf("This is the line before the call.\n");
_CALL(PRINT_THIS);
_printf("This is the line after the call.\n");
Then the output would look like
This is the line before the call.
Inside the procedure.
This is the line after the call.
Would be JUST as fast as
_printf("This is the line before the call.\n");
_printf("Inside the procedure.\n");
_printf("This is the line after the call.\n");
Osiris SE Technical Reference Manual Page 275
Summary
_Cast(chickens, Class);
chickens : user defined variable.
CLASS : The variables NEW data CLASS.
Description
The function _CAST lets you quickly change a variables
data CLASS and have the CURRENT contents placed in the
new CLASS.
You can safely CAST up to larger data CLASS because the
next largest CLASS always includes the LOWER CLASSES.
You should be careful when CASTING down to lower
CLASSES. If the variable you're CASTING has a value that
is larger than the upper range of the new data CLASS,
the value will be altered to FIT into the new CLASS
_DEFINE_VAR(X,INTEGER);
_ASSIGN(X,10);
x has the an INTEGER data CLASS and contains the value
10.
_CAST(X,UNSIGNED_INTEGER);
x now as an UNSIGNED_INTEGER data CLASS and contains the
value 10.
_CAST(X,LONG);
x now has a LONG data CLASS and contains the value 10.
Here is where you can get into trouble.
_DEFINE_VAR(X,REAL);
_ASSIGN_VAR(X,32769.55);
x has a REAL data CLASS and contains the value 32769.55
_CAST(X,LONG);
x now has a LONG data CLASS and contains the value
32769
Since a LONG is an extended integer, the .55 was lost
during the casting operation.
_CAST(X,UNSIGNED_INTEGER);
Osiris SE Technical Reference Manual Page 276
x now has an the data CLASS UNSIGNED_INTEGER and
contains the value 32768
_CAST(X,INTEGER);
x now has the data CLASS of an INTEGER and contains -
32768. The value when from positive to negative because
the original value exceed the maximum range of an
INTEGER.
_CAST can be very useful, but it can also get you into
trouble if you aren't careful.
_CAST becomes even more confusing when you start
switching in and out of CHARACTER and STRING classes.
Suppose you have defined CH as a CHARACTER class
variable. You use _GETC(CH,1) and the caller types in
'A'.
If you cast ch to an integer, _CAST(CH,INTEGER), you
will end up with ch containing 65, the ASCII value of
'A'.
If you cast ch to a string, _CAST(CH,STRING), you'll end
up with ch containing "A". Notice the double quotes, it
is NOT the same as 'A'. CH is now a STRING CLASS
variable capable of holding a string one character long.
Suppose 'string' was declared as STRING(80) and had
"67" in it.
_CAST(string,integer);
string would have the integer number 65 in it.
_CAST(string,character);
string would have 'C' in it, 67 is the ASCII value for
an uppercase 'C'.
When you start casting outside of the integer family,
things can get hard to follow, real quick.
Osiris SE Technical Reference Manual Page 277
Summary
_Chdir(directory);
directory : A user defined variable, STRING CLASS or a
string constant.
Description
_CHDIR does the same works like the DOS CD command, but
can also change DRIVES if a drive letter is used.
This function does NOT remember where you were. It is up
to you to restore the current drive and/or directory
when you are done with what every it was you were doing
in the other directory.
Example
_chdir("D:\game2");
_chdir("C:\osiris");
Osiris SE Technical Reference Manual Page 278
Summary
_Clear(variable);
variable : User define variable
Description
A very FAST way to clear a variables contents. If it's
an INTEGER, UNSIGNED_INTEGER, LONG, UNSIGNED_LONG, REAL,
or CHARACTER the value will be set to zero.
If it is a STRING CLASS variable, the contents will be
set to NULL, empty string.
Tip: An empty string has the string length of 0.
Example
_define_var(sum, integer);
_assign(sum, 10);
_printf("Sum = %d\n",sum);
output :
Sum = 10
_clear(sum);
_printf("Sum = %d\n",sum);
output :
Sum = 0
Osiris SE Technical Reference Manual Page 279
Summary
_Cls();
Description
CLS will clear the screen, using the screen clear method
the caller has selected; ansi, FF, or CR/LF.
Example
None Required.
Osiris SE Technical Reference Manual Page 280
Summary
_Color(value);
value : INTEGER constants.
Description
The color function uses ANSI to change the foreground
color to the color pointed to by value, an INTEGER
CONSTANT.
Value can be any number between and including 1 - 31.
Color # Color Produced
0 Black
1 Blue
2 Green
3 Cyan
4 Red
5 Magenta
6 Brown
7 White
8 Gray
9 Light Blue
10 Light Green
11 Light Cyan
12 Light Red
13 Light Magenta
14 Yellow
15 Bright White
Add 16 to the above to generate Blinking colors.
Example
_color(9);
_printf("Hello!");
"Hello!" would be printed in Light blue.
_color(26);
_printf("HELLO");
"HELLO" would be printed in blinking light green.
Osiris SE Technical Reference Manual Page 281
Summary
_Command_queue_status(rtcode);
rtcode : User defined variable, INTEGER CLASS
Description
This function checks the Osiris command stacking queue
and places a 0 in rtcode if there are pending commands.
If no commands are pending, a 1 is placed in rtcode.
Example
_define_var(rtcode,integer);
_command_queue_status(rtcode);
_if(rtcode)
_call(displaymenu);
_endif;
Osiris SE Technical Reference Manual Page 282
Summary
_Convert_to_bbs_case(s1);
s1 : A user defined variable, STRING CLASS
Description
Converts the contents of s1 to BBS case (first letter of
a word to upper case and the rest of the word to lower
case).
If you are altering one of the user record predefined
variables and it is a string variable, you must call
this function to convert the contents of to BBS case
before placing it back into the predefined variable.
Example
_define_var(city,string(80));
_assign(city,_CITY);
_printf("Edit City Field : %s",city);
_gets(city,26);
_convert_to_bbs_case(city);
_assign(_CITY,city);
Osiris SE Technical Reference Manual Page 283
Summary
_Copy_ch(ch,string,position);
ch : user defined variable, CHARACTER CLASS
string : user defined variable, STRING CLASS
position: user defined variable, INTEGER CLASS, or an
Integerconstant.
Description
_Copy_CH is a high speed function used to extract a COPY
of a single character from a string. The character is
placed in ch. This function does NOT alter the string.
The character to extract is pointed to by position.
Keep in mind that a STRING CLASS is actual made up of
individual CHARACTERS.
The string
SYSOP
is 5 CHARACTERS tied together by the STRING CLASS
declare. But, each individual character can be extracted
and worked with.
SPL/I, even the C programming language, starts labeling
individual characters in a string with 0. That can, at
times, be confusing since we're use to starting things
with a 1.
SYSOP
01234
Y has a position of 1, O has a position of 3.
To extract Y from this string and assuming the variable
was named JOHN.
_COPY_CH(ch,JOHN,1);
The variable ch, CLASS CHARACTER, now has the contents
of Y and
_printf("The 2nd character in your name is %c\n",ch);
would produce the output
The 2nd character in your name is O
Osiris SE Technical Reference Manual Page 284
Example
_define_var(ch,character);
_define_var(name,String(50));
_define_var(x,INTEGER);
_assign(name,_name); _assign(ch,0);
_math(x = 0);
_copy_ch(ch,name,x);
_while(ch != ' ' .AND. ch);
_putc(ch);
_++(x);
_copy_ch(ch,name,x);
_Wend;
This program segment will print the callers FIRST name.
Program Explanation
The first 3 defines set-up the variables that will
be used. The first assign copies the callers name,
from the predefined variable _name, into the
variable called name.
The second define makes sure the character
variable, ch, contains something other than a
space.
The math statement is used to initialize the
variable x to 0. The math statement has less
overhead than the assign so it is quicker. Because
the first character within a string has the
position of 0, we want x to also be 0.
The while segment of the program that will loop as
long as CH does not have a space in it, but ch does
have something in it. The "SOMETHING IN IT" is used
is a safety catch that will keep us from exceeding
the end of the string if a space isn't included in
the variable name.
In this case you really don't have to worry about
that because Osiris does require two names and
there is always a space between them. I wanted to
include it so you'd KNOW that under most conditions
you SHOULD use this type of safety catch when the
contents of a string is totally unknown.
Osiris SE Technical Reference Manual Page 285
_while(ch != ' ' .AND. ch);
This is the glue that holds the thing together. As
long as the variable ch does not have the value of
' ' or space .AND. it does have something in it,
then execute the body of the while loop. That's why
we used the assign statement to initialize ch. We
want to make sure ch will pass the test so the body
of the while statement will be executed as least
once.
_putc(ch);
This uses the high speed, low overhead, character
print routine to display the contents of ch. You
could have used _printf("%c",ch), but _putc(ch) is
much faster.
_++(x);
This is something you haven't seen yet, but it
basically bumps the value in the variable x by 1.
It has almost zero overhead and it is the fastest
method of incrementing an Integer variable by 1.
_copy_ch(ch,name,x);
Here we copy a character from name, TYPE STRING,
into ch, CHARACTER CLASS. The character to copy is
pointed to by the variable x.
Status table ( name = John Doe)
Variable Contents Times Though The Loop.
----------------------------------------------------------------
x 0 0
ch J 0
x 1 1
ch o 1
x 2 2
ch h 2
x 3 3
ch n 3
x 4 4
ch SPACE 4
Loop terminates, ch has a space in it.
Program output: John
Osiris SE Technical Reference Manual Page 286
Here is an example of why you should normally use
the safety check:
Status table ( name = JohnDoe)
Variable Contents Times Though The Loop.
----------------------------------------------------------------
x 0 0
ch J 0
x 1 1
ch o 1
x 2 2
ch h 2
x 3 3
ch n 3
x 4 4
ch D 4
x 5 5
ch o 5
x 6 6
ch e 6
x 7 7
ch NULL 7
If you just looked for a space, you would not find
one. You would continue to increment x and you
would be in an infinite loop, until your program
attempt to access a memory address that did not
exist and then the computer would lock up.
The contents of any STRING variable, will always
end with a NULL, a zero, which will evaluate to
FALSE.
Again, always use a safety catch if you're not sure
what you're testing for is going to be there.
Since we know that a space is going to be there,in
this case, the best way to do it
_while(ch != ' ');
_putc(ch);
_++(x);
_copy_ch(ch,name,x);
_Wend;
Doing away with the .AND. will create a faster
routine.
Osiris SE Technical Reference Manual Page 287
Summary
_Continue;
Description
This statement can be used in a while loop to alter the
normal flow of a program. When _continue is encountered,
the rest of the iteration will be skipped and the next
iteration to be stared.
Example
_while( count < 201);
_if(count < 101);
_continue;
_endif;
_printf("Count = %d\n",count);
_wend
The first 100 times through, the _IF(count < 101) will
cause the continue statement to be executed and
_printf("Count = %d\n",count);
will be skipped.
-----------------
v |
_while( count < 201); |
|
_if(count < 101); |
_continue;--------
_endif;
_printf("Count = %d\n",count);
_wend
Osiris SE Technical Reference Manual Page 288
Summary
_Curget(row,col);
Row,
Col, : User defined variables, INTEGER CLASS.
Description
This function retrieves the current position of the
cursor, and stores it in the variables ROW and COL.
The curget function would be used in conjunction with
the window functions to save the cursor, prior to
opening a window, and then restore the cursor after the
window has been closed.
See Openwindow/Closewindow/Clearwindow for example.
Osiris SE Technical Reference Manual Page 289
Summary
_Dayofweek(day);
day : User defined variable, INTEGER CLASS.
Description
_Dayofweek returns the current day of the week in the
variable day. Days are numbered 1- 7 representing Monday
to Sunday.
Example
_define_var(today,integer);
_dayofweek(today);
Osiris SE Technical Reference Manual Page 290
The following commands pertain to Btree Database
functions. See the section on Btree databases for a
tutorial on database construction.
Summary
_Addrecord();
_Loadrecord(rtcode,key);
_Copyfrom(dest,field#);
_Opendatabase(fname);
_Closedatabase();
_Getnextrecord(rtcode);
_Settofirstrecord();
_Deleterecord(rtcode,key);
_Rewriterecord();
_Copyto(field#,source);
Description
_Addrecord(), adds the current database record to the
database.
_Loadrecord(rtcode,key), loads the database record
pointed to by KEY. 1 is placed in Rtcode, a INTEGER
CLASS variable, if the record was loaded. 0 is placed in
rtcode if the record could not be loaded, i.e., the key
did not match anything.
Key is a string variable or a string constant contain
the KEY to search for.
_Copyfrom(dest,field#), copies a database field to a
destination variable so you can work with or display the
field. The database field will be CAST to fit the
variables CLASS, if possible.
In other words, if field #3 contained 3456.99 and dest
was a INTEGER CLASS variable, 3456 would be placed in
dest. To successful CAST field 3, you would need to
provide a REAL CLASS variable.
If field 3 contained "THE SYSOP" and dest was a LONG
CLASS variable, 0 would be placed in dest. Field 3
contains string data and you should have provided a
STRING CLASS variable to hold it.
_Opendatabase(fname), opens the database pointed to by
fname, a STRING CONSTANT. Fname should contain the full
drive, path, and name of the database (minus the file
extension).
E.g., OpenDataBase("C:\osiris\vetlink");
Osiris SE Technical Reference Manual Page 291
Opens the vetlink database located in the directory
"C:\osiris". The files vetlink.dat, vetlink.idx, and
vetlink.dbs must be in that directory.
_Closedatabase(), close the current database. Failure to
close a database prior to exiting a command file or
before opening another database can have undefined
results.
_Getnextrecord(rtcode), get the next available database
record. If another record is available, 1 is placed in
rtcode. If no records are available, 0 is placed in
rtcode. Rtcode is a user defined variable, INTEGER
CLASS.
_Settofirstrecord(), positions the internal record
pointer so the next call to GetNextRecord will retrieve
the FIRST record in the database.
_Deleterecord(rtcode,key), deletes the database record
pointed to by Key. Key is a STRING CLASS variable or
string constant. If the record was deleted, 1 is placed
in Rtcode, an INTEGER CLASS variable. If no record
matched the KEY, 0 is placed in Rtcode.
_Rewriterecord(), saves the current record to the
database. This function is generally used when you alter
a non-key field in a record and want the new field saved
to the database.
_Copyto(field#,source), copies the contents of source to
the database field pointed to by Field#. The data in
source is CAST to fit the database field.
Osiris SE Technical Reference Manual Page 292
Summary
_Define_var(name,class);
name : The name you have chosen to call this variable.
class: A variable needs to have its CLASS announced
when you define it. SPL/I uses eight keywords to set up
data CLASSES:
Integer
Unsigned_Integer
Long
Unsigned_Long
Real
Character
String(size)
File
Below is a chart showing the different CLASSES and the
values they can hold.
CLASS Range
--------------------------------------------------------
nteger -32768 to 32768
Unsigned_Integer 0 to 65535
Real Number 3.4E-38 to 1.7E+308
Character ASCII 0 to ASCII 255
Long -2,147,483,648 to 2,147,483,647
Unsigned_Long 0 to 4,294,967,295
String (*1) ASCII 0 to ASCII 255
FILE (*2) Segment and offset address of
file handle.
*1 A string must have its size declared, the maximum
number of characters it can hold. For all practical
purposes, there is no limit on the size of a string.
But, the bigger the string, the more memory it takes and
you do have a limit on the memory SPL/I will allow you
to use for variable storage. SPL/I will allow you to use
up to 40,000 bytes of heap space.
Heap is the memory, assigned to the program by DOS,
left to the program after it has loaded and allocated
its own variables.
You COULD create a string that can hold up to 40,000
bytes, but that would use all of your variable HEAP
space and there isn't a whole lot you can do with only
one variable.
Osiris SE Technical Reference Manual Page 293
Warning!
SPL/I, in most cases, does NOT check the string
variable to see if it has enough space to store
what you're attempting to put in it. It is up to
YOU to see that you don't put something into a
string that's to big to fit. This isn't unique, all
programming languages leave it up to the programmer
to do that type of grunt work.
Examples
_define_var(name,string(20))
_assign(name,"This string is way to long to fit!");
The results, undefined. By that I mean anything can
happen.
Example
_define_var(name,String(80));
Defines a variable called name of
STRING CLASS with a maximum storage
space is 80 characters.
_define_var(sum,INTEGER);
Defines a variable called sum with an INTEGER CLASS.
_define_var(output,FILE);
Defines a variable called output with a FILE CLASS.
Tip
This is way I do in all my 'C' programs and I'm
also doing it in my SPL/I programs so read and
learn:
Its not a bad idea to setup a couple of GRUNT
INTEGER variables and a couple of 80 character
strings to handle repetitive tasks.
I generally always set-up two INTEGER variable and
I always call them x and y.
I don't use them for any specific purpose. But I do
use them in FOR loops, to hold return codes, loop
counters (such as _++(x) and _--(x), and just
general work integers.
Osiris SE Technical Reference Manual Page 294
By predefining a couple of work variables, the
program can run faster because it doesn't have to
repeatedly allocate variables for repetitive tasks.
By using static names, I know by looking at my code
that those variables can be safely used for the
purposes I've outlined.
I will also setup two string variables, generally
80 characters, and I almost always use the names
junk1 and junk2.
I'll also setup a CHARACTER variable and I always
call it CH.
By predefining those 5 variables, I know I will
always have something to work with and the program
will run faster because it doesn't have to
repeatedly allocate and deallocate work space.
Osiris SE Technical Reference Manual Page 295
Summary
_Display_memo_record(data_file,index_file,record_no.);
data_file,
index_file : String constant
Record_no : Integer constant
Description
Data_file contains the full drive, path, and filename to
the memo database.
Index_file contains the full drive, path, and filename
to the memo index file.
Record_NO is the memo record number you want displayed
to the caller.
See section in SE400 on Memo databases for further
details.
Example
_display_memo_record("c:\add.dat","c:\add.idx",3);
Displays the 3rd memo record from the add database and
uses the add.idx file to find the location of the 3rd
record.
Osiris SE Technical Reference Manual Page 296
Summary
_Display_menu(cmds,fname);
cmds : String CONSTANT
fname : A user defined variable, STRING CLASS or a
string constant
Description
A special TYPE of _display_text() function that
allows HOTKEYS to interrupt the display. This works
like the displaying of a menu from within Osiris and
when a caller with HOTKEYS presses a valid menu option,
the menu will stop and Osiris processes the character.
CMS is a string of UPPERCASE characters or menu
options.
FNAME is the name of the menu to display.
Example
_display_menu("ABCDEFG?","MSGAREA");
Display the menu MSGAREA.MMU/ANS/ASC and if
A,B,C,D,E,F,G, or ? is sent by the caller; abort the
display and proceed with the next command, generally an
input prompt.
Osiris SE Technical Reference Manual Page 297
Summary
_Display_text(filename);
Filename : User defined, STRING CLASS, variable or a
constant.
Description
This function calls the MMU system to display a text
file. This would be the fastest method of display large
volumes of text that does not need formatting. Using the
MMU system would allow you to use the MMU color commands
and would allow the caller to break out of the display.
Warning
Do NOT under any circumstances use the MMU script
command [RUN_PROGRAM] in ANY file you display via
the _display_text command. Your system will LOCKUP.
Example
_Define_Var(FILENAME,STRING(80));
_ASSIGN(FILENAME,"C:\OSIRIS\USER.LOG");
_DISPLAY_TEXT(FILENAME);
or
_DISPLAY_TEXT("C:\OSIRIS\USER.LOG");
Osiris SE Technical Reference Manual Page 298
Summary
_Dorinfo(path,prog);
path : User defined variable, STRING CLASS or a string
constant.
prog : User defined variable, STRING CLASS or a string
constant.
Description
This is used to create the RBBS/QuickBBS DORINFOx.DEF in
the directory pointed to by the PATH.
PROG is the name of the external program, generally a
batch file used to change into the directory and run
the program, to run.
Example
_dorinfo("c:\osiris\game2","runtw.bat");
In this example, dorinfox.def will be written in the
sub-directory c:\osiris\game2 and the program runtw.bat
will then be executed. The extension of .bat isn't
required, but it guarantees that runtw.exe or runtw.com
isn't called by mistake.
Osiris SE Technical Reference Manual Page 299
Summary
_Doorsys(path,prog);
path : User defined variable, STRING CLASS or a string
constant.
prog : User defined variable, STRING CLASS or a string
constant.
Description
This is used to create DOOR.SYS in the directory
pointed to by the PATH.
PROG is the name of the external program, generally a
batch file used to change into the directory and run
the program, to run.
Example
_doorsys("c:\osiris\game2","runtw.bat");
In this example, DOOR.SYS will be written in the sub-
directory c:\osiris\game2 and the program runtw.bat will
then be executed. The extension of .bat isn't required,
but it guarantees that runtw.exe or runtw.com isn't
called by mistake.
Osiris SE Technical Reference Manual Page 300
Summary
_Elseif(expression......);
body1
_Else;
body2
_Eend;
Description
The body of the _elseif statement is executed
selectively, depending on the value of 'expression'.
First, 'expression' is evaluated. If 'expression' is
true, body1 is executed. If the 'expression' is false,
body2 of the _ELSEIF is executed.
'expression' is a sequences of TESTS that can be
evaluated to either TRUE or FALSE. The TESTS are
identical to those available under the _IF function. See
section on _IF for further details.
BODY1 and BODY2 require the _ELSE declaration to
separate the two bodies.
Osiris SE Technical Reference Manual Page 301
Example
The integer variable COW contains 10.
First using _IF
_IF(COW < 11);
_sprint("You don't have many cows do you?\n");
_ENDIF;
_IF(COW > 10);
_sprint("You have a LOT of cows!\n");
_ENDIF;
There isn't anything WRONG with this, it will work, but
it does require TWO different evaluations, one for each
if. That doesn't take a LOT of time, but this type of
testing would benefit for _ELSEIF.
The same program done with ELSEIF
_ELSEIF(COW < 11);
_sprint("You don't have many cows do you?\n");
_ELSE;
_sprint("You have a LOT of cows!\n");
_EEND;
Since you're going to print one or the other, you only
need to test one of them. If it fails, then you're
obviously going to print the other.
Often life offers us more than two choices. You can
extend the elseif structure by NESTING multiple ELSEIF
statements. It can get a little difficult to read, so be
careful you don't go too deep. We've tested the ELSEIF
nested 12 levels without running into any problems.
Osiris SE Technical Reference Manual Page 302
Example Of Nesting Elseif Statements.
_define_var(result,integer);
_define_var(input,string(5));
_cls();
_sprint("Beginning Test\n");
_sprint("Select a number (1 or 2) ? ");
_gets(input,1);
_sprint("\n");
_atoi(result,input);
_elseif(result = 1);
_sprint("You entered 1\n");
_sprint("Select a number (1 or 2) ? ");
_gets(input,1);
_sprint("\n");
_atoi(result,input);
_elseif(result = 2);
_sprint("This time you entered 2\n");
_sprint("Select a number (1 or 2) ? ");
_gets(input,1);
_sprint("\n");
_atoi(result,input);
_elseif(result = 1);
_sprint("This time you entered 1\n");
_else;
_sprint("This time you entered 2\n");
_eend;
_else;
_sprint("This time you entered 1\n");
_eend;
_else;
_sprint("You entered 2\n");
_sprint("Select a number (1 or 2) ? ");
_gets(input,1);
_sprint("\n");
_atoi(result,input);
_elseif(result = 2);
_sprint("This time you entered 2\n");
_else;
_sprint("This time you entered 1\n");
_eend;
_eend;
Osiris SE Technical Reference Manual Page 303
Here is one nested 12 levels
_define_var(ch,character);
_cls();
_sprint("Enter your selection (A-Z) ? ");
_getc(ch,1);
_sprint("\n");
_elseif( ch = 'A');
_printf("CH = A\n");
_else;
_elseif( ch = 'B');
_printf("CH = B\n");
_else;
_elseif(ch = 'C');
_printf("CH = C\n");
_else;
_elseif(ch = 'D');
_printf("CH = D\n");
_else;
_elseif(ch = 'E');
_printf("CH = E\n");
_else;
_elseif(ch = 'F');
_printf("CH = F\n");
_else;
_elseif(ch = 'G');
_printf("CH = G\n");
_else;
_elseif(ch = 'H');
_printf("CH = H\n");
_else;
_elseif(ch = 'I');
_printf("CH = I\n");
_else;
_elseif(ch = 'J');
_printf("CH = J\n");
_else;
_elseif(ch = 'K');
_printf("CH = K\n");
_else;
_elseif(ch = 'L');
_printf("CH = L\n");
_else;
_sprint("Not a valid selection\n");
_Eend;
_Eend;
_Eend;
_Eend;
_Eend;
_Eend;
_Eend;
Osiris SE Technical Reference Manual Page 304
_Eend;
_Eend;
_Eend;
_Eend;
_Eend;
It takes no more MEASURABLE time to reach the inner most
sprint statement than to read the 3rd printf statement,
9 levels above.
Many will select this method for menus, but there is a
better or rather easier approach (Next Page)
Osiris SE Technical Reference Manual Page 305
_define_var(ch,character);
_define_var(not_done,integer);
_assign(not_done,1);
_while(not_done);
_cls();
/* Display your menu here */
_sprint("Please enter your selection ? ");
_getc(ch,1);
_sprint("\r \r");
_if(ch = 'Q');
_sprint("Quit Requested.\n");
_clear(not_done);
_getc(ch,0);
_continue;
_endif;
_if(ch = 'A');
_sprint("CH = A\n");
_getc(ch,0);
_continue;
_endif;
_if(ch = 'B');
_sprint("CH = B\n");
_getc(ch,0);
_continue;
_endif;
_if(ch = 'C');
_sprint("CH = C\n");
_getc(ch,0);
_continue;
_endif;
_if(ch = 'C');
_sprint("CH = D\n");
_continue;
_endif;
_sprint("That is not a valid selection!\r");
_getc(ch,0);
_sprint(" \r");
_wend;
_sprint("\rLine after WEND\n");
Osiris SE Technical Reference Manual Page 306
Here we've used the while's CONTINUE statement to skip
the remaining lines in the body of the while statement
once we've found a match.
This isn't any faster or slower than the nested ELSEIF
tests, but given the number of nest levels it bypasses,
it is a lot easier to read, and debug.
Some of you will no doubt worry that the a statement
like:
_if(access < 10);
The body of this if statement contains 5000 lines
of code. I'm not going to expand this document by 5000
lines.
_endif;
If the program is being executed from the disk, an
instruction at a time, if the IF test fails . . . there
would be a noticeable delay as the next 5000+
instructions were read from the disk and discarded.
No, there is no delay. If the IF test fails, the
instruction following _ENDIF will be executed within
3/100ths of a second.
I can do this by using a principle known as base-
displacement addressing or explicit addressing. The idea
is that within a program the relative positions of any
two statements are fixed, such that if the absolute
address of any one statement in the program were known,
then the address of other statements could be
calculated. To do this, I would compute the distance
between the statement whose absolute address is know and
the one who's address is to be found. The distance,
measured in bytes, is call a displacement.
ITlink has one advantage that most compiler do not have.
When a program, EXE or COM is compiled, the compiler
does not know the base address for the starting
instruction. It has to leave the base address as a
variable and do something like JUMP BASE_REGISTER+5.
ITlink, on the other hand, know exactly where the base
address is going to be so I can calculate the
displacement address during the compile and enter an
implicit address instead of an explicit address. That
will save the command processor a lot of computations
when a JMP instruction is needed.
Osiris SE Technical Reference Manual Page 307
Summary
_Execute(memory,program,rtcode);
memory : An integer constant
program : A user defined variable, STRING CLASS or a
string constant
rtcode : A user defined variable, INTEGER CLASS.
Description
This function enables you to run a DOS command, batch
file, or another program as a sub-task of your program.
The size of the program you can run depends on the
amount of memory you have allocated to the program. You
may allocate from 90K to 634K to the program. Attempting
to allocate LESS than 90K will generally lock the
computer when the command processor attempts to load
command.com. The amount of memory is specified in the
memory argument, an integer constant. The memory
argument REQUIRES an integer constant.
The program, DOS command, or batch file to run, along
with any command line arguments that program may need,
must be in the program argument. This argument may be a
string constant or it can be a string variable.
After the program, batch file, or DOS command has been
executed, the return code, if any, will be placed in the
variable RTCODE. RTCODE MUST be an integer variable.
Quickbasic Brun.exe
Some QUICKBASIC Brun modules conflict with the
overlay cache. If you request 600K or more memory,
Osiris will flush the overlay cache, free the EMS
or XMS memory allocated to the cache and then close
the Osiris.ovl file before executing the
application.
When you return, the overlay cache will be
reallocated and the Osiris.ovl file will be
reopened.
Osiris SE Technical Reference Manual Page 308
Example
Lets suppose that you have just completed filling out a
form of some type and you want to store that form in a
pkzip archive, encrypted with a password. You also want
the caller to pick-out the name of the finished zip
file.
_define_var(cmd_line,string(128));
_define_var(pwd,string(9));
_define_var(fname,string(13));
_define_var(len,integer);
_define_var(rtcode,integer);
_define_var(not_done,integer);
_define_var(ch,character);
_define_var(loop,integer);
_clear(len);
_while(len < 1);
_cls();
_sprint("Please Enter a Password ? ");
_gets(pwd,8);
_strlen(pwd,len);
_if(len < 1);
_sprint("\n\nYou have to enter a Password.\n\n");
_sprint("Press RETURN to Try Again.\n");
_getc(ch,0);
_endif;
_wend;
_cls();
_assign(not_done,1);
_while(not_done);
_clear(len);
_while(len < 1);
_cls();
_sprint("Please Enter a Filename ? ");
_gets(fname,8);
_strlen(fname,len);
_if(len < 1);
_sprint("\n\nYou have to enter a filename.\n\n");
_sprint("Press RETURN to Try Again.\n");
_getc(ch,0);
Osiris SE Technical Reference Manual Page 309
_endif;
_for(rtcode = 0 : < len : 1 );
_copy_ch(ch,fname,rtcode);
_if(ch = '.');
_cls();
_sprint("'.' is not legal. *I'll* add the extension!\n");
_clear(len);
_sprint("Press RETURN to Try Again.\n");
_getc(ch,0);
_endif;
_Fend;
_wend;
_filexists(rtcode,fname);
_if(rtcode);
_cls();
_printf("I'm sorry, '%s' already exists.\n",fname);
_sprint("Please select a new name.\n");
_sprint("\nPress RETURN to continue.\n");
_getc(ch,0);
_endif;
_if(rtcode = 0);
_assign(not_done,0);
_endif;
_wend;
_cls();
_sprint("Please stand by, archiving in progress . . . ");
_sprintf(cmd_line,"pkzip -m -ex -s%s %s form1.txt",pwd,fname);
_execute(256,cmd_line,rtcode);
_if(rtcode);
_sprint("\n\nArchive failure. Please notify Sysop.\n\n");
_unlink("form1.txt");
_endif;
Osiris SE Technical Reference Manual Page 310
Summary
_Fclose(stream);
stream : A user defined variable, FILE CLASS, the same
variable used to open the file.
Description
The _fclose function closes the file pointed by stream.
The file buffer is flushed prior to closing, provided
the file was opened with "WRITE".
Example
_define_var(IN,FILE);
_fopen("c:\osiris\cbis1.log",IN,"read");
_fclose(IN);
Osiris SE Technical Reference Manual Page 311
Summary
_Fcloseall(value);
value : A user defined variable, INTEGER CLASS.
Description
The _Fcloseall function closes ALL open files. All file
buffers are flushed prior to closing, provided the file
was opened with "WRITE".
You should use this function as a DEBUGGING aid prior to
exiting a command file to determine if you have failed
to close any open files.
If _fcloseall has to close any open file, the number of
files closed will be assigned to value.
Example
_define_var(OpenFiles, INTEGER);
_FcloseAll(OpenFiles);
_IF(OpenFiles);
_CLS;
_printf("\aE\aR\aR\aO\aR\a!\a!\a!\a\n\n");
_printf("I screwed up and left %d Files Open.\n",OpenFiles);
_printf("\nI'd better check this out ASAP!\n\n");
_ENDIF;
_EXIT;
Osiris SE Technical Reference Manual Page 312
Summary
_Fgets(string, N, Stream, Rtcode, Flag);
string : A user defined variable, STRING CLASS.
n : Number of characters to read.
stream : A user defined variable, FILE CLASS, the
same variable used to open the file.
rtcode: A user defined variable, INTEGER CLASS
flag : Integer CONSTANT
Description
The _fgets functions reads a string from the file and
stores it in "string". Characters are read from the
current file position up to and including the first new-
line character, up to the end of the file, or until the
number of characters read is equal to n-1, whichever
comes first.
The result is stored in "string".
FLAG will determine whether or not the new line
character, if read, will be place in the string. If flag
is 0, the new line character will be placed in the
string. If FLAG is 1, the new line character will be
discarded.
If an error or end-of-file condition occurs, 0 will be
placed in RTCODE. If RTCODE contains 1, characters were
successful read from the file and placed in the string.
Example
_define_var(IN,FILE);
_define_var(input_string,string(80));
_define_var(rtcode,integer);
_fopen("c:\osiris\cbis1.log",IN,"read");
_fgets(input_string,80,IN,rtcode,1);
_ELSEIF(rtcode = 1);
_printf("I just read ->%s<- from the file.\n",input_string);
_ELSE;
_printf("There was an error reading the file!\n");
_EEND;
_fclose(IN);
Osiris SE Technical Reference Manual Page 313
Summary
_Fildate(filename,y,m,d);
Filename : A user defined variable, STRING CLASS, or a
string constant.
Y,
M,
D : User defined variables, INTEGER CLASS
Description
This function retrieves the a files DATE stamp in YEAR,
MONTH, and DAY format and stores it in the user defined
variables.
The name of the file is retrieved from Filename.
Example
_DEFINE_VAR(Year,INTEGER);
_DEFINE_VAR(Month,INTEGER);
_DEFINE_VAR(Day,INTEGER);
_PRINTF("The Files Date Stamp was : ");
_FILTIME("C:\OSIRIS\TIME.LOG",Year,Month,Day);
_PRINTF("%02d/%02d/%02d\n",Month,Day,Year);
produces the output
The Files Time Stamp was : 02:23:46
Osiris SE Technical Reference Manual Page 314
Summary
_File_command_access(cmd_number,rtcode);
cmd_number : Integer constant
rtcode : User defined variable, INTEGER CLASS
Description
This function checks for access to a specific primary
menu command, pointed to by cmd_number, in the
current file area.
If you have access to the command, access level and
access flags are checked, 1 is placed in rtcode. If you
do not have access to the command, 0 is placed in
rtcode.
CMD_NUMBER is the number of the command:
CMD_NUMBER Function
0 Change Area
1 Goodbye
2 Search
3 Upload
4 Download
6 View Archive Contents
8 Quick File List
9 Kill File
10 Full File List
11 Type a text file
12 Reset Protocol
13 Extract File From Archive
14 Search for new uploads
17 Your transfer stat's
18 Edit file queue
Example
_define_var(rtcode,integer);
_file_command_access(9,rtcode);
_elseif(rtcode);
_kill_file();
_else;
_printf("You can't kill a file!\n");
_eend;
Osiris SE Technical Reference Manual Page 315
Summary
_Filexists(rtcode,filename);
FILENAME : A user defined variable, STRING CLASS, or a
string constant.
RETCODE : A user defined variable, INTEGER CLASS.
Description
The function _FILEXISTS determines if the file, defined
by FILENAME exists.
If the file exists, 1 is placed in RETURN CODE. If File
does NOT exist, 0 is placed in RETCODE.
Example.
_Define_Var(FileName,STRING(80));
_Define_Var(RetCode,INTEGER);
_ASSIGN(Filename,"C:\OSIRIS\OUT1.QBS");
_FILEXISTS(RetCode,Filename);
_ELSEIF(RetCode != 0);
_PrintF("The File \"%s\" does exist.\n",Filename);
_ELSE;
_Printf("The file \"%s\" does NOT EXIST!\n",Filename);
_EEND;
Osiris SE Technical Reference Manual Page 316
Summary
_Filsize(filename,size);
FILENAME : User defined variable, STRING CLASS, or a
string constant.
SIZE : User defined variable, LONG CLASS.
Description
This function, _FILSIZE, places the size of the file
pointed to by Filename into the variable Size.
This function does NOT verify that the file exists, it
just assumes that you have taken care of that.
Size MUST be a variable with a LONG CLASS.
Example
_Define_Var(FileName,STRING(80));
_Define_Var(RetCode,INTEGER);
_Define_Var(FileSize,LONG);
_ASSIGN(Filename,"C:\OSIRIS\OUT1.QBS");
_FILEXISTS(RetCode,Filename);
_ELSEIF(RetCode != 0);
_PrintF("The File \"%s\" does exist.\n",Filename);
_FILSIZE(Filename,FileSize);
_Printf("The size of the file was %l Bytes.\n",FileSize);
_ELSE;
_Printf("The file \"%s\" does NOT EXIST!\n",Filename);
_EEND;
Osiris SE Technical Reference Manual Page 317
Summary
_Filtime(filename,h,m,s);
Filename : A user defined variable, STRING CLASS, or a
string constant.
H,
M,
S : User defined variables, INTEGER CLASS
Description
This function retrieves the a files TIME stamp in HOUR,
MINUTE, and SECOND format and stores it in the user
defined variables.
The name of the file is retrieved from Filename.
Example
_DEFINE_VAR(HOUR,INTEGER);
_DEFINE_VAR(MINUTE,INTEGER);
_DEFINE_VAR(SECOND,INTEGER);
_PRINTF("The Files Time Stamp was : ");
_FILTIME("C:\OSIRIS\TIME.LOG",HOUR,MINUTE,SECOND);
_PRINTF("%02d:%02d:%02d\n",HOUR,MINUTE,SECOND);
produces the output
The Files Time Stamp was : 02:23:46
NOTES: The seconds will always be an even number,
including zero, due to the method that DOS uses to store
the file's TIME parameter.
Osiris SE Technical Reference Manual Page 318
Summary
_Fopen(path,variable,type);
Description
The _fopen function opens the file specified by PATH.
The VARIABLE is a user defined variable FILE CLASS that
will be used to reference this file by other SPL/I file
functions.
The character string TYPE specifies the type of access
requested for the file, as follows:
Type Description
----------------------------------------------------------
READ Opens the file for reading. If the file does not
exist or cannot be found, the _fopen call will
fail.
APPEND Opens the file for writing at the end of the file
(appending). If the file does not exist, it will be
created.
WRITE Opens an empty file for writing. If the given file
already exists, its contents will be destroyed.
When a file is opened with APPEND, all write operations
occur at the end of the file. Although the file pointer
can be repositioned using _rewind, the file pointer will
always move back to the end of the file before any write
operation is carried out. Thus, existing data cannot be
overwritten.
Example
_DEFINE_VAR(OUTPUT,FILE);
_FOPEN("C:\TEMP\-TMP.$$$",OUTPUT,WRITE);
_ELSEIF(OUTPUT);
_fprintf(OUTPUT,"This is the first line.\n");
_ELSE;
_printf("Could not open the file!\n");
_EEND;
_FCLOSE(OUTPUT);
Osiris SE Technical Reference Manual Page 319
Explanation
When a variable has been defined as having FILE
CLASS, its value is set to NULL or ZERO. When that
variable has been used to OPEN a file, its value
contains the offset/segment address of the file
handle, a NONE ZERO number.
Although you may not alter a variable that has been
defined as having a FILE CLASS, you can do
conditional tests with it.
The _ELSEIF(OUTPUT) is a classic example of
conditional TRUE/FALSE testing. Anything with a
value of 0 is considered to be false and would fail
any conditional test.
If the variable has any value other than 0, it is
considered to be TRUE and would PASS any
conditional test.
Maximum Open Files
Although SPL/I does not place any restrictions on
the number of files you may have open at once, DOS
does.
The maximum number of open files will be determined
by the FILES= statement in your CONFIG.SYS.
Osiris SE Technical Reference Manual Page 320
Summary
_For(start = Value : Condition End : Step);
_Fend;
start : User defined variable, INTEGER CLASS.
value : User defined variable, INTEGER CLASS or INTEGER
constant.
condition : Greater than sign or Less than sign; > or <.
end : User defined variable, INTEGER CLASS or INTEGER
constant.
step : User defined variable, INTEGER CLASS or INTEGER
constant.
Description
This function is commonly referred to as FOR NEXT and it
is the fastest method of doing a control loop between
two fixed location.
The for function requires a number of arguments. The
first argument is the variable to store the starting
value in. The second argument is the starting value
itself, generally 1 or 0 but any value, within the
INTEGER CLASS, is allow. The 3rd argument is the TYPE of
conditional test that determines when to end the loop.
You always use either the > or < symbols. The test
symbols = and != do not make sense in a FOR/NEXT.
The 4th argument is the value to compare the current
value of start with. This can be a variable or an
INTEGER constant. The final value is the step rate,
generally 1 or -1.
Osiris SE Technical Reference Manual Page 321
The way it works:
_define_var(x,integer);
_define_var(y,integer);
_assign(y,20);
_for(x = 1 : < y : 1);
_printf("x now equals : %d\n",x);
_FEND;
When the program hits the _for statement, it will assign
the value of 1 to the variable x, "x = 1". It will then
test it to see if it is less than the y, " < y". We
assigned y the value of 20, " _assign(y,20) ", so the
test returns TRUE and the program enters the BODY of the
FOR/NEXT loop, the items between _for and _fend.
_printf is executed.
The program hits the _FEND and adds 1 to x. 1 is the
step rate ": 1)". x now contains the value 2.
Since _FEND was encountered, the program will cycle back
to the top and do the test "is x less than y". If it is,
the body of the loop will be executed again.
This will continue until x < y is no longer TRUE. In
this case, the body of the function would be executed 19
times.
The step value does not have to be 1, it can be; 2, 5,
25, 124, etc, it can also be a negative number; -1, -5,
-10, etc.
Osiris SE Technical Reference Manual Page 322
Example 1
_define_var(row,integer);
_define_var(col,integer);
_define_var(ch,character);
_define_var(pattern,character);
_assign(pattern,'*');
_cls();
_for(row = 1 : < 13 : 1);
_locate(row,1);
_for(col = 1 : < 40 : 1);
_putc(pattern);
_FEND;
_FEND;
_for(row = 12 : > 0 : -1);
_for(col = 80 : > 39 : -1);
_locate(row,col);
_putc(pattern);
_fend;
_fend;
_for(row = 1 : < 13 : 1);
_locate(row,1);
_for(col = 1 : < 40 : 1);
_putc(' ');
_FEND;
_FEND;
_for(row = 12 : > 0 : -1);
_for(col = 80 : > 39 : -1);
_locate(row,col);
_putc(' ');
_fend;
_fend;
_locate(14,1);
I'm not going to tell you what the program does, type it
in an run it.
Osiris SE Technical Reference Manual Page 323
Here is another example, a prime number generator, that
uses _FOR as well as WHILE and IF.
It will display all the prime numbers between 1 and 251.
_define_var(number,integer);
_define_var(divisor,integer);
_define_var(dummy,integer);
_define_var(count,integer);
_define_var(limit,integer);
_assign(count,0);
_assign(limit,251);
_for(number = 2 : < limit : 1);
_assign(divisor,2);
_math(dummy = number % divisor);
_while(dummy);
_++(divisor);
_math(dummy = number % divisor);
_Wend;
_if(divisor = number);
_printf("%5d ",number);
_++(count);
_if(count > 9);
_assign(count,0);
_printf("\n");
_endif;
_endif;
_FEND;
The approach is quite straightforward but is not the
ultimate in efficiency. For example, if you are testing
to see if 121 is prime, there is no need to check
divisors pass 11. If any divisor bigger than 11 went in
evenly, the result of the division would be a number
smaller than 11, and that divisor would have been found
earlier. Thus, we only need to check divisors up to the
square root of the number, but the programming for that
is a bit trickier. I'll leave that as an exercise for
one of you clever readers to figure out.
Osiris SE Technical Reference Manual Page 324
Summary
_Fprintf(file,format{,variable 1, Variable 2, .....});
Description
The _fprintf function formats and prints a series of
characters and values to a disk file, pointed to by
file, according to the corresponding format
specifications.
The format is the same form and functions as the format
argument for the _printf function; see the _printf
reference pages for description of format and variables.
"file" is a user defined variable that has been declared
as having FILE CLASS.
Before you can write to a file, it must first be OPENED;
see the _fopen references pages for information on
opening files.
Example:
_fopen("TEST.OUT",OUTPUT,WRITE);
_fprintf(OUTPUT,"Hello %s!\nHow's the weather in %s?\n\n",NAME,CITY);
_fprintf(OutPut,"You're current access level is %u\n\n",ACCESS);
_fclose(output);
Osiris SE Technical Reference Manual Page 325
Summary
_Free_var(name);
name : user defined variable.
Description
The function _free_var frees the memory used to store
the variable back to the variable pool.
Example
_define_var(name,string(40));
_assign_var(name,_NAME);
_printf("Your name is %s.\n",name);
_free_var(name);
Osiris SE Technical Reference Manual Page 326
Summary
_Fscanf(return_code,stream,format{variables....});
return_code : A use defined variable, INTEGER CLASS;
stream : A user defined variable, FILE CLASS, the
same variable that was used to OPEN the
file.
The _fscanf function reads data from the file and stores
it in the variables. Each variable must be the same
CLASS specified in format.
Format is read left to right. When the first format
specification is encountered, the value of the first
input field is converted and stored in the first
variable according to the format specifications. The
second format specification causes the second input
field to be converted and stored in the second variable,
and so on. If there are more variables than format
specifications, the extra variables will be ignored.
The results are undefined if there are not enough
variables for all the format specifications or the
variable isn't the same as the CLASS defined in the
format specification.
If the format specification indicates a string field, it
is your responsibility to insure the string is large
enough to hold that value assigned to it. If it isn't,
the results are undefined.
The _fscanf function stores the number of fields
successfully converted in return_code. If end-of-file,
_fscanf stores -1 in return_code;
A format specification has the following form:
%CLASS
CLASS Description Range
-----------------------------------------------------------
d Integer -32768 to 32768
u Unsigned_Integer 0 to 65535
r Real Number (*1) 3.4E-38 to 1.7E+308
c Character ASCII 0 to ASCII 255
l Long -2,147,483,648 to 2,147,483,647
x Unsigned_Long 0 to 4,294,967,295
s String (*2) ASCII 0 to ASCII 255
.lm20
File Field Delimiters
_FSCANF uses two types of FILE FIELD DELIMITERS,
blank and new-line. A FILE FIELD DELIMITER
separates the fields stored in the file.
Example of FILE FIELD DELIMITING
The Sysop is 21.
^ ^ ^
This string would have four fields, three would
require string format specifiers and the forth
could be integer, signed, long, unsigned long, or
real, depending on what you were going to use it
for because it is small enough to fit in any of the
data CLASSES that contain numbers.
v v v
The Sysop is
21.
Even thou this string has multiple blanks and spans
two physical lines, it would be treated exactly
like the prior string. Multiple blanks are ignored
and the new-line character would be the forth field
delimiter.
Osiris SE Technical Reference Manual Page 327
Example
_define_var(IN, FILE);
_define_var(FNAME, STRING(36));
_define_var(LNAME, STRING(36));
_define_var(AGE, INTEGER);
_define_var(Fields_Converted, INTEGER);
_fopen("TEST.FILE,IN,"READ");
_fscanf(Fields_Converted,in,"%s %s %d",Fname,Lname,Age);
_Elseif(Fields_Converted != -1);
_printf("Total Number of Fields Successfully ");
_printf("Converted : %d\n",Fields_Converted);
_printf("The Twits First Name was : %s\n",fname);
_printf("The Twits Last Name was : %s\n",lname);
_printf("He was %d years Old.\n",age);
_ELSE;
_printf("Error, End-Of-File Was Reached.\n");
_EEND;
_Fclose(in);
Osiris SE Technical Reference Manual Page 328
Summary
_Get_ctrled_input(ch,cmds);
ch : A user defined variable, CHARACTER CLASS
cmds : A string constant
Description
This function duplicates the input prompts used by
Osiris at the main, message, and file menus.
CH is a character variable used to store the input
obtained from the caller. This function will
automatically force the response to UPPER CASE, i.e., a
will become A before you get it.
Cmds is a string constant containing a list of the
command keys that are accepted at the current moment.
Anything not in the cmds list will be ignored.
Example
_define_var(ch,character);
_get_ctrled_input(ch,"ABCDEDF/");
Osiris SE Technical Reference Manual Page 329
Summary
_Getc(char,force_upper);
char : A user defined variable, CHARACTER CLASS.
force_upper : An INTEGER CONSTANT, 0 or 1.
Description
The function getc obtains a 1 character response from
the caller or the local keyboard and stores it in char.
If force_upper is turned on, 1, then the character will
be stored in upper case format. The default is to store
the character without altering it.
In other words, 'a' is NOT the same as 'A'. If the
caller types 'a' and you are looking for 'A', menu
option, this lower case 'a' will NOT match during a
conditional test.
E.g.,
_getc(ch,0);
ch has 'a' in it.
_IF(ch = 'A');
will return FALSE.
_getc(ch,1); FORCES the 'a' to 'A'. If it is already
'A', then it is left alone.
This would allow you to use 'a-z' and 'A-Z' on the same
menu, gives you twice as many options. It might be a tad
confusing to NEW users, but they would get use to it.
Example
_DEFINE_VAR(ch,character);
_printf("Press A) or B) : ");
_getc(ch,0);
_printf("\nYou entered %c\n",ch);
Osiris SE Technical Reference Manual Page 330
Summary
_Gets(str,len);
str : A user defined variable, STRING CLASS.
len : An INTEGER CONSTANT.
Description
Gets is used to obtain STRING input from the caller or
local keyboard. The number of characters the caller is
allowed to enter will be governed by the value of len.
If len is equal to 10, the caller may only enter up to
10 characters, numbers, or what have you.
WHAT the caller entered will be placed in the variable
str.
Example
_DEFINE_VAR(NAME,STRING(40));
_printf("Please enter your name ? ");
_gets(name,36);
_printf("\n\nYou entered : %s\n",name);
Osiris SE Technical Reference Manual Page 331
Summary
_Global_download();
Description
This gives you access to the download system within
Osiris without going through the normal _download()
function.
The different between this function and the _download
function; Global_download() requires that you place the
name or names of the files to be sent in the command
stacking Queue with the push_into_queue command (command
covered in another section of this document).
Global_download does NOT retain the current contents of
the file queue. In other words, it is cleared before the
new file names are inserted.
All files pushed into the command stacking queue MUST be
listed in one of your file areas AND the caller must
have access TO that file area.
Example
_push_into_queue("I512?.ARJ");
_global_download();
Osiris SE Technical Reference Manual Page 332
The next 39 commands are Highlevel Commands that allow
you to access certain built in Osiris functions. The
commands are fairly self explanatory, do not require
additional arguments, nor do they return any error
codes. If you are in doubt as to what a specific command
does, throw it into a test.prg file and try it. You
can't hurt anything <smile>.
_Post_private_msg();
_Post_msg_to_sysop();
_Display_protocol_name();
_Goto_file_system();
_Goto_msg_system();
_Run_newmail_scan();
_Run_newuploads_scan();
_Goto_online_store();
_Show_who_is_online();
_Goto_log_off();
_Goto_display_version();
_Goto_status_system();
_Page_sysop();
_Goto_adjust_user_settings();
_Display_callers();
_Goto_msg_center();
_Edit_conf_boards();
_Change_file_area();
_Search_for_file();
_Upload();
_View_archive();
_Quick_file_list();
_Full_file_list();
_Kill_file();
_Type_text_file();
_Select_protocol();
_Extract_file();
_Transfer_stats();
_Edit_queue();
_Download();
_Internode_chat();
_Read_bulletins();
_Private_mail_scan();
_New_bulletin_scan();
_Change_msg_areas();
_Enter_message();
_Read_messages();
_Pack_messages();
_Drop_carrier();
Osiris SE Technical Reference Manual Page 333
Do you want to create powerful, intelligent, versatile,
and useful programs? Then you need a language that
provides the three basic forms of program "flow"
control. According to computer science (which is the
science of computers and not science by computers ---
yet), a good language should provide three forms of
program flow:
1. Executing a series of statements.
2. Repeating a sequence of statements until some
condition is met.
3. Using a test to decide between alternative actions.
The first form we know, all SPL/I programs consists of a
sequence of statements. The WHILE loop is one example of
the second form. The final form, choosing between
different possible courses of action, makes a program
much more "intelligent".
The _IF statement
Summary
_If(expression......);
body
_Endif;
Description
The body of the _if statement is executed selectively,
depending on the value of 'expression'. First,
'expression' is evaluated. If 'expression' is true, the
body is executed. If the 'expression' is false, the body
of the _IF statement is ignored.
Each _IF must have a corresponding _ENDIF to mark where
the body of the _IF ends.
'expression' is a sequences of TESTS that can be
evaluated to either TRUE or FALSE.
Osiris SE Technical Reference Manual Page 334
TEST Symbol FORM Explanation
----------------------------------------------------
> x > y If the value or contents of x is
greater than the value of y, the
test would evaluate to TRUE,
otherwise it would evaluate to
FALSE.
< x < y If the value or contents of x is
less then the value or contents
of y, the test would evaluate to
TRUE, otherwise it would evaluate
to FALSE.
= x = y If the value or contents of x is
equal to the value or contents of
y, the test would evaluate to
TRUE, otherwise it would evaluate
to FALSE.
!= x != y If the value or contents of x is NOT
equal to the value or contents of
y, the test would evaluate to
TRUE, otherwise it would evaluate
to FALSE.
(*) x and y would be two variables or constants.
You'll notice there isn't a "greater than or equal to"
or "less than or equal to" symbols, they aren't needed.
For example:
if( A >= 10)
If contents of variable A is greater than or equal to 10
then do this.
is EXACTLY the same as
IF(A > 9)
With one major difference, (A > 9) is executed faster
because it is a SINGLE test while (A >= 10) would
require TWO tests.
When one of the four basic tests is used in expression,
you may use either; a user defined variable, a
predefined variable, or a constant on the left or right
side of the test symbol.
Osiris SE Technical Reference Manual Page 335
The two values being tested MUST be the same data CLASS.
If the value on the left side of the test symbol is an
INTEGER, the value on the right side of the test symbol
must also be an INTEGER.
If it isn't, the test will always produce FALSE. This is
due to the way data is stored in the computer. The
computer uses different storage formats for different
data CLASSES.
If one of the values is a constant and that constant is
not a string or an integer, don't forget to include the
CLASS indicator, see section constants for details on
CLASS indicators.
If the constant is a CHARACTER, the constant must be
start with ' and end with ', no spaces.
E.g.,
If the variable CH was defined as having a CHARACTER
CLASS and you wanted to test using a CHARACTER CONSTANT
_IF(CH = 'A');
or
_IF('A' = CH);
Both would produce the same results.
_IF('A' = 'A');
or
_IF(CH = CH);
is valid, but doesn't make a lot of sense because the
tests will always evaluate TRUE.
Example
_Define_Var(Mike,String(80));
_Define_Var(Bill,String(80));
_Assign(Mike,"The Sysop");
_Assign(Bill,"Sysop");
I've defined two string variables that may hold any
string up to 80 characters long. I've assigned the value
"The Sysop" to the variable Mike, and "Sysop" to the
variable Bill.
Osiris SE Technical Reference Manual Page 336
_IF(Mike = Bill);
_ENDIF;
The expression would evaluate to FALSE because Mike
contains "The Sysop" and Bill contains "Sysop". Thus,
the two variables are NOT equal.
Since the expression evaluated to FALSE, the body of the
_IF statement is ignored.
_IF(_ACCESS > 10U);
_ENDIF;
The variable _ACCESS is an SPL/I predefined unsigned
integer variable that contains the callers access level.
10U is a CONSTANT and the trailing U indicates that it
is an unsigned integer. See section on Constants for
details.
Here I'm wanting to know if the callers access level is
greater than 10.
If the value of _ACCESS is 20, the expression would
evaluate TRUE and the body of the _IF statement would be
processed.
If the value of _ACCESS was 5, the expression would
evaluate to FALSE and the body of the _IF statement
would be ignored.
An _IF statement may contain more than one expression
separated by either .AND. or .OR..
_IF(_ACCESS > 20 .AND. _ACCESS < 30 .OR. _ACCESS = 10U);
_ENDIF;
Multiple expressions are evaluated from left to right
and the results of the current evaluation will be
combined with the results of the prior evaluation. How
they are combined depends on the type of conditional
separator used.
Osiris SE Technical Reference Manual Page 337
If .AND. is used as the separator, the evaluation will
only be TRUE if BOTH tests were TRUE.
Example:
_ACCESS > 10 .AND. _ACCESS < 30
The first expression, _ACCESS > 10, is evaluated. The
2nd expression, _ACCESS < 30, is evaluated.
The results are then compared and if BOTH evaluated to
TRUE, the expression "_ACCESS > 10 .AND. _ACCESS < 30"
would evaluate TRUE. If either or both evaluated to
FALSE, the expression "_ACCESS > 10 .AND. _ACCESS < 30"
would also evaluate FALSE.
If .OR. is used as the separator, the evaluation will be
TRUE if EITHER tests was TRUE.
Example:
_ACCESS > 10 .OR. _ACCESS < 30
The first expression, _ACCESS > 10, is evaluated. The
2nd expression, _ACCESS < 30, is evaluated.
The results are then compared and if EITHER evaluated
TRUE, the expression "_ACCESS > 10 .OR. _ACCESS <
30" would evaluate TRUE.
_IF(_ACCESS > 20 .AND. _ACCESS < 30 .OR. _ACCESS = 10U);
The first expression, "_ACCESS > 20" is evaluated. The
2nd expression, "_ACCESS < 30 is evaluated and the
results are combined using the .AND.
The 3rd expression, "_ACCESS = 10U" is evaluated and
combined with the last evaluation.
Osiris SE Technical Reference Manual Page 338
Status Table Representing of
_IF(_ACCESS > 20 .AND. _ACCESS < 30 .OR. _ACCESS = 10U);
and assuming _ACCESS contained the value 10.
Expression Conditional Separator Current Evaluation
Status
-----------------------------------------------------------
_ACCESS > 20 ------------------------------> FALSE
_ACCESS < 30 ------------------------------> FALSE
_ACCESS = 10U -----------------------------> TRUE
|
The entire statement evaluates TRUE
Status Table Representing of
_IF(_ACCESS > 20 .AND. _ACCESS < 30 .OR. _ACCESS = 100U);
and assuming _ACCESS contained the value 10.
Expression Conditional Separator Current Evaluation
Status
-----------------------------------------------------------
_ACCESS > 20 ------------------------------> FALSE
_ACCESS < 30 ------------------------------> FALSE
_ACCESS = 100U ----------------------------> FALSE
The entire statement evaluates FALSE
Osiris SE Technical Reference Manual Page 339
Status Table Representing of
_IF(_ACCESS > 20 .AND. _ACCESS < 30 .OR. _ACCESS = 100U);
and assuming _ACCESS contained the value 25.
Expression Conditional Separator Current Evaluation
Status
-----------------------------------------------------------
_ACCESS > 20 ------------------------------> TRUE
_ACCESS < 30 ------------------------------> TRUE
_ACCESS = 100U ----------------------------> FALSE
The entire statement evaluates TRUE
Status Table Representing of
_IF(_ACCESS > 20 .AND. _ACCESS = 30 .OR. _ACCESS = 100U);
and assuming _ACCESS contained the value 25.
Expression Conditional Separator Current Evaluation
Status
----------------------------------------------------------
_ACCESS > 20 ------------------------------> TRUE
_ACCESS = 30 ------------------------------> FALSE
_ACCESS = 100U ----------------------------> FALSE
The entire statement evaluates FALSE
Although _ACCESS > 20 did produce a TRUE evaluation,
_ACCESS = 30 produced a FALSE evaluation and when .AND.
is used, BOTH have to evaluate TRUE for the expression
to evaluate TRUE.
Osiris SE Technical Reference Manual Page 340
Nesting
SPL/I, unlike some programming Language, does offer
a _ELSE IF statement, covered later, but SPL/I also
supports multiple nested _IF statements.
Example
_IF(expression......);
_IF(expression......);
_IF(expression......);
_IF(expression......);
_ENDIF;
_ENDIF;
_ENDIF;
_ENDIF;
Using nested _if statements can make your program
code harder to follow, and debug, and if a while
loop or an else if can be used instead of nesting,
do so.
Trick!
_IF(_ACCESS);
What'll happen:
Since I only have one item to work with and no test
symbols to tell me how you want to test, I'll
evaluate the variable itself.
The variable _ACCESS will produce either a TRUE or
FALSE evaluation depending on it's contents. If the
contents is 0, then it will evaluate to FALSE. If
_ACCESS has any value other than zero, it will
evaluate TRUE.
String variables will evaluate depending on their
contents. If a String is empty, it evaluates FALSE.
If the string contains ANYTHING, it evaluates TRUE.
This can be used in a number of ways. Suppose you
get string input from the caller and you want to
know if he just pressed RETURN without entered
anything.
Assume that filename is a string variable and you
just asked the caller to enter the name of the file
to view.
Osiris SE Technical Reference Manual Page 341
_ELSEIF(filename);
_ELSE;
_printf("Jerk, you have to enter something!\n\n");
_EEND;
Suppose you open a file for read and you want to
display the contents of the file to the caller. You
also want to make sure you haven't mucked up and
closed the file and forgotten about it so:
_IF(INPUT);
_ASSIGN(RTCODE,1);
_WHILE(RTCODE);
_fgets(string,128,INPUT,RTCODE,0);
_if(RTCODE);
_printf("%s\n",string);
_ENDIF;
_WEND;
_ENDIF;
You can do that because the variable FILE is set to
NULL or zero when there is no OPEN file associated
with it.
Osiris SE Technical Reference Manual Page 342
Summary
_Is_message_area_selected(area#, Rtcode);
rtcode : A user defined variable, INTEGER CLASS
Area# : A user defined variable, INTEGER CLASS or an
integer constant
Description
This function places a 1 in rtcode if the caller has
the conference area, pointed to by Area#. A 0 is placed
in rtcode if the caller does NOT have the area selected.
Example
_define_var(returncode,Integer);
_is_message_area_selected(2,returncode);
_elseif(returncode);
_else;
_printf("You do not have that area selected!\n");
_eend;
Osiris SE Technical Reference Manual Page 343
Summary
_Locate(row,col);
row,
col : User defined variable, INTEGER CLASS, or INTEGER
constants.
Description
Positions the cursor on row and col. ANSI is used to
move the cursor.
ANSI uses screen rows 1 - 25 and columns 1 - 80.
Osiris SE Technical Reference Manual Page 344
Summary
_Main_command_access(cmd_number,rtcode);
cmd_number : Integer constant
rtcode : User defined variable, INTEGER CLASS
Description
Checks the callers access level and command flags
against the main menu COMMANDS pointed to by the
CMD_NUMBER. If the caller has access to the command,
1 is placed in rtcode. If the caller does not have
access to the command, 0 is placed in rtcode.
CMD_NUMBER Function
0 Conference Message Area
1 File Areas
2 Log off
3 Your Personal Stat's
4 Read Bulletins
5 Page Sysop
6 Change Settings
7 User List
8 Show Version
9 On-line Store
10 Internode Chat
11 Message Center
12 Who Else is On0line
13 System Download
14 System Stat's
Example
_define_var(rtcode,integer);
_file_command_access(9,rtcode);
_elseif(rtcode);
_printf("Going to the On-line store, stand by . . .");
_else;
_printf("You do not have access to the on-line store!.\n");
_eend;
Osiris SE Technical Reference Manual Page 345
Summary
_Make_mask(dest,source,mask);
mask : String constant
Source,
Dest : A user defined variable, STRING CLASS
Description
This makes a copy of the source string and places it in
the format specified by the MASK. The new string is
placed in the variable dest.
Dest, where you want the end results of to be placed.
Source, contains the data to be converted. Mask, the
PICTURE mask (See _masked_input for details on a mask
field and PICTURE characters).
The original SOURCE is NOT altered.
If the source string contained 3143346359 and the mask
"(999) 999 - 9999" were used, the dest variable would
contain: (314) 334 - 6359
If there is no data for the PICTURE character, the
mask is longer than the data in the SOURCE
variable, a blank space will be added to pad the
field.
If the data does not match the PICTURE character, a
blank space will be used.
In other words, should SOURCE contain 31433A6359 and
the MASK was (999) 999-9999
The display would be (314) 33 -6359. The "A" is
not inserted because the PICTURE for that position
REQUIRES a number.
Example
_define_var(dest,string(80));
_define_var(source,string(80));
_assign(source,"494753999");
_make_mask(dest,source,"999-99-9999");
_printf("%s\n",dest);
output: 494-75-3999
_assign(source,"042767");
_make_mask(dest,source,"99/99/99");
_printf("%s\n",dest);
output: 04/27/67
Osiris SE Technical Reference Manual Page 346
Summary
_Masked_input(flag,s1,mask);
flag : An integer constant, 0 or 1
s1 : A use defined variable, STRING CLASS
mask : A string constant
Description
Like the DBASE PICTURE command, this allows you to
get input, from the caller, in a specific format.
Flag, either 0 or 1, determines IF the caller MUST fill
in the entire mask. If 0, the caller does NOT have to
fill in the entire mask. If set to 1, the caller MUST
fill the entire mask.
S1 is the user defined string variable used to store the
input. No LENGTH checking is done and the variable must
be large enough to hold what the caller entered.
Mask is a string constant used to store the mask.
Valid PICTURE symbols are : A 9 X
A = Allow any letter between and including A - Z.
9 = Allow any number between and including 0 - 9.
X = Allow anything.
All other character will be treated as part of the
display mask and will simply be printed to the screen.
The input is stored in the S1 variable, but the mask
is NOT.
In other words, _masked_input(1,s1,"(999) 999-9999"
would force you to enter something like :
(314) 334-6359.
The value actually stored in S1 would be
3143346359. This saves space if the input is going to
be placed in a Database Field.
_masked_input will COUNT the number of PICTURE
characters and limit input to that many characters.
_masked_input(1,s1,"(999) 999-9999") would limit input
to 10 digits.
Osiris SE Technical Reference Manual Page 347
Providing the caller correctly implements the
Backspace character, ASCII 8, the entire mask and the
number of fields (shown as under score characters) will
be displayed.
In the case of the above mask, the caller would see
(___) ___-____ and would be positioned here --|
^--------------------------------------------|
If ASCII 8 is not correctly implemented then the caller
will only see (_. The rest of the mask will then be
displayed when needed.
If the caller backspaces to erase a character, the
original mask will be restored in place of the erased
character.
E.g.,
Original mask : (___) ___ - ____
Caller typed : (314) 334 - 34__
^
Backspaces to |
v
Results : (31_) ___ - ____
Examples
_masked_input(1,s1,"(999) 999 - 9999");
Used to obtain a phone number.
_masked_input(1,s1,"999-99-9999");
Used to obtain a social security number.
_masked_input(1,s1,"99/99/99");
Used to obtain a date in MMDDYY format.
Osiris SE Technical Reference Manual Page 348
Summary
_Math(results = Format);
results : A user defined variable having a CLASS of
REAL, INTEGER, UNSIGNED_INTEGER, LONG, or
UNSIGNED_LONG
format : containing the math formula.
Description
The function _math does arithmetic operations based on
the contents of format.
format contains the arithmetic operations and has the
following format:
<VALUE 1><SPACE><OPERATOR><SPACE><VALUE 2>
VALUE 1 : A user defined variable or a constant.
<SPACE> : A blank space to denote end of constant
<OPERATOR>: The arithmetic operation to perform.
SPL/I supports the following arithmetic operator:
+ {ADD}
- {SUBTRACT}
* {MULTIPLE}
/ {DIVIDE}
>> {Right Shift}
<< {Left Shift}
OR {Bitwise OR}
AND {Bitwise AND}
XOR {Bitwise Exclusive OR}
% {MODULUS}
VALUE 2 : A user defined variable or a constant.
The ORDER of operation, which has top priority, is
simple. First come, first serve. In 'C' you have to
worry about the priority of the operators.
I.e.,
In 'C' result = 10 + 5 * 2 would give you 20 because *
has a higher priority than + and 5 * 2 + 10 = 20, it (C
compiler) rearranged your formula!
Osiris SE Technical Reference Manual Page 349
If you were thinking 10 + 5 * 2 = 30, you would not end
up with what you were expecting or wanted.
SPL/I simplifies that a bit, by assigning priority in
the order you've defined the operations.
E.g., result = 10 + 5 * 2 would give you 30.
Example
_MATH(TOTAL = cows + pigs + chickens);
_math(cows = 10 + 500 / 2 * 2);
Restrictions
All variables used within a math formula have to
have the same DATA CLASS. Constants will be
converted to the correct DATA CLASS. The correct
DATA CLASS will be determined by the variable used
to store the results.
Only user defined variables can be used in a math
formula. Predefined SPL/I variables may NOT be used
in a math formula.
If you NEED to switch the CLASS of a variable in
order to use it, use the _CAST function prior to
calling the _MATH function.
Advanced Arithmetic Operations
You'll notice that there are some arithmetric
operators that you may not have seen before:
>> : Right Shift
<< : Left Shift
OR : Bitwise OR
AND : Bitwise AND
XOR : Bitwise Exclusive OR
because they are generally used in computer based
math.
Bit Fiddling, Operators And Fields
Some programs need (or, at least, benefit
from) an ability to manipulate individual bits
in a variable.
Osiris SE Technical Reference Manual Page 350
Operators
SPL/I offers bitwise logical operators and
shift operators. In the following, I'll write
values in binary notation so you can see the
mechanics. In actual programs, you would use
integer, unsigned integers, long, unsigned
long, and constants written in the usual
forms. For instances, instead of (00011001),
you would use 25. In my examples, I'll use 8-
bit numbers, with the bits numbered 7 to 0,
left to right.
Bitwise Logical Operators
The three bitwise logical operators work on
the INTEGER CLASS, and extended INTEGER
CLASSES (Unsigned_Integer, Long, and Unsigned
LONG). They are termed "bitwise" because they
operate on each bit independently of the bit
on the left or right.
Bitwise And
This binary operator makes a bit-by-bit
comparison between two operands. For each bit
position, the resulting bit is 1 only if both
corresponding bits in the operands are 1. In
terms of true-false, the result is true only
if each of the two bit operands is true. Thus,
10010011 AND 00111101 would equal 00010001
since only bits 4 and 0 are 1 in both
operands.
10010011
00111101
---------
00010001
Bitwise Or
This binary operator makes a bit-by-bit
comparison between two operands. For each bit
position, the resulting bit is 1 if either of
the corresponding bits in the operands is 1.
In terms of true-false, the result is true if
one or the other bit operands are true or if
both are true. Thus
10010011 OR 00111101 would equal 10111111
Osiris SE Technical Reference Manual Page 351
Bitwise Exclusive Or: Xor
This binary operator makes a bit-by-bit
comparison between two operands. For each bit
position, the resulting bit is 1 if one or the
other, but NOT both, of the corresponding bits
in the operands is 1. In terms of true-false,
the result is true if one or the other bit
operands, NOT BOTH, are true.
Thus,
10010011 XOR 00111101 would equal 10101110
10010011<----------
00111101<----------|
-------- |
10101110 |
|
Since bit position 0 has the value of 1 in
both operands, the resulting 0 bit has the
value of 0.
Case Sensitive
The arithmetric operators; OR, AND, and XOR
are CASE SENSITIVE, or is NOT the same as OR.
Use only UPPER CASE with these three
operators.
Usage
The bitwise logical operators often are used
to set certain bits while leaving others
unchanged. For example, suppose we have a
variable (unsigned integer) called MASK and it
has a value of 2, in binary that is 00000010
with only bit number 1 being nonzero. The
unsigned integer variable flag has the value
of 15 (0001111).
The statement
_math(flag = flag AND MASK);
would cause all the bits in flag, except bit
1, to be set to 0, since any bit combined with
0 via the AND operator yields 0. Bit number 1
will be left unchanged.
00001111
00000010
--------
00000010
Osiris SE Technical Reference Manual Page 352
This is mostly commonly used to determine IF a
bit is turned on.
_math(Flag = Flag OR MASK);
If mask contained 00000010 and flag contained
00001101 the results would be
|
00000010 |
00001101 |
--------- |
00001111 <-----------------
Using the bitwise LOGICAL Operators does mean
you have to be able to convert base 10 numbers
to base 2 in order to determine which bits are
on or off for any given value.
Converting between number bases isn't that
difficult, but if you don't want to learn . .
binary and binary to base 10 conversions. It
should also be able to convert to base 16,
commonly called HEX notation.
Bitwise Shift Operators
The bitwise shift operators shift bits to the
left or right. Again, I'll write binary
numbers explicity to show the mechanics.
Left Shift: <<
This operator shifts the bits of the left
operand to the left by the number of places
given by the right operand. The vacated
positions are filled with 0s, and bits moved
past the end of the left operand are lost.
Thus,
10001010 << 2 would equal 00101000 where each
bit is moved two places to the left.
Osiris SE Technical Reference Manual Page 353
Right Shift: >>
This operator shifts the bits of the left
operand to the right by the number of places
given by the right operand. Bits moved past
the right end of the left operand are lost.
For UNSIGNED_INTEGER and UNSIGNED_LONG, the
places vacated at the left end are replaced by
0s. For INTEGER and LONG, the result is
machine dependent. The vacated places may be
filled with 0s, or they may be filled with
copies of the sign bit. For an UNSIGNED
INTEGER, we have
10001010 >> 2 equals 00100010 where each bit
is moved two places to the right.
Usage
The bitwise shift operators provide swift,
efficient multiplication and division by
powers of 2.
number << n multiplies number by 2 to the nth
power.
number >> n divides number by 2 to the nth
power if number is not negative.
Example
Osiris stores a number of items in PACKED fields,
to conserve space, the callers original log on date
and the TIME of day he last called are two such
items.
If you were to simply PRINT those numbers, they
would not APPEAR to be what they really represent.
The DATE for instances, may print as 12456, which
doesn't mean a whole lot.
In order to UNPACK the date or time fields into
hour, minute, second, year, month, and day format,
you have to use the bitwise operators.
Osiris SE Technical Reference Manual Page 354
E.g.,
_DEFINE_VAR(YEAR,UNSIGNED_INTEGER);
_DEFINE_VAR(MONTH,UNSIGNED_INTEGER);
_DEFINE_VAR(DAY,UNSIGNED_INTEGER);
_DEFINE_VAR(HOUR,UNSIGNED_INTEGER);
_DEFINE_VAR(MIN,UNSIGNED_INTEGER);
_DEFINE_VAR(SEC,UNSIGNED_INTEGER);
_DEFINE_VAR(TIME,UNSIGNED_INTEGER);
_DEFINE_VAR(ODATE,UNSIGNED_INTEGER);
_ASSIGN(ODATE,_FDATE);
_ASSIGN(TIME,_LTIME);
_MATH(DAY = ODATE << 11 >> 11);
_MATH(MONTH = ODATE << 6 >> 11);
_MATH(YEAR = ODATE >> 10 + 80);
_PRINTF("%02u/%02u/%02u\n",MONTH,DAY,YEAR);
_MATH(HOUR = TIME AND 63488 >> 11);
_MATH(MIN = TIME AND 2016 >> 5);
_MATH(SEC = TIME AND 31 * 2);
_PRINTF("%02u:%02u:%02u\n",HOUR,MIN,SEC);
Modulus Operator: %
The modulus operator is used in integer
arithmetic. It gives the remainder that results
when the integer to the left is divided by the
integer to its right. For example, 13 % 5 (read
as "13 modulo 5") has the value of 3 since 5
goes into 13 twice, with a remainder of 3.
Don't bother trying to use this operator with
anything other than an INTEGER, it just won't
work.
At first glance, this operator may strike you
as an esoteric tool for mathematicians, but
actually it is rather practical. One common use
is to help you control the flow of a program.
Suppose, for example, you had a program that
needed to do something extra every third month.
Just have the program evaluate the month number
modulo 3 (i.e., month % 3) and check to see if
the result is 0.
Osiris SE Technical Reference Manual Page 355
Summary
_Msg_command_access(cmd_number,rtcode);
cmd_number : Integer constant
rtcode : User defined variable, INTEGER CLASS
Description
Checks to see if you have access to the message area
command indicated by the CMD_NUMBER. If you do, 1 is
placed in rtcode. If you do not have access to the
command, 0 is placed in rtcode.
CMD_NUMBER
0 Change Areas
1 Goodbye
2 New Conference Mail Check
4 Enter New Message
6 Read Messages
7 Conference Menu
17 Message Center
18 Pack Messages
Example
_define_var(rtcode,integer);
_file_command_access(18,rtcode);
_elseif(rtcode);
_printf("Packing Messages, please stand by....);
_else;
_printf("You do not have access to pack messages!.\n");
_eend;
Osiris SE Technical Reference Manual Page 356
Summary
_Printf(format{,variable 1, Variable 2, .....});
Description
The _printf function formats and prints a series of
characters and values to the serial port and the local
display screen. The format, what you want to print,
consists of ordinary characters, escape sequences, and
(if variables follow the format) format specifications.
The format MUST begin with double quotes and it must END
with double quotes.
Ordinary characters and escape sequences are simply
copied to the serial port and the local display screen.
For example, the line
_printf("Line one\n\nLine two\n");
produces the output
Line one
Line two
Escape Sequences Output
-------------------------------------------------------------
\r Places cursor on First Column of Screen.
\n Starts a New Line
\a Rings the Bell
Any character following the Escape Character, backslash,
that is not one of the defined escape sequences will be
copied to the local display screen and to the serial
port.
Examples
_printf("LINE ONE");
_printf("LINE TWO");
Without the escape sequence \n, the output produced by
the prior two print statements would look like:
LINE ONELINE TWO
Including the \n
_printf("LINE ONE\n");
_printf("LINE TWO\n");
Osiris SE Technical Reference Manual Page 357
produces the output
LINE ONE
LINE TWO
Another example would be the percent sign. Since the
percent sign is part of the format specifications, using
_printf("Results were 100%\n");
would produce undefined results.
The statement
_printf("Results were 100\%\n");
would produce the correct results, 100%.
If variables or constants follow format, then format
must contain format specifications that determines where
and how the variables or constants will be displayed.
Format specifications, discussed below, always begin
with a percent sign(%).
Format is read left to right. When the first format
specification (if any) is encountered, the value of the
first variable or constant after format is converted and
displayed according to the format specifications. The
second format specification causes the second variable
or constant to be converted and displayed, and so on. If
there are more variables or constants than format
specifications, the extra variables or constants will be
ignored.
The results are undefined if there are not enough
variables or constants for all the format
specifications.
A format specification has the following form:
%{flags}{width}CLASS
Flags Meaning Default
----------------------------------------------------------
- Left justify the result Right justify
within the given field
width. This argument has
no meaning unless the
width argument is also
used.
Osiris SE Technical Reference Manual Page 358
The width argument is a non-negative decimal integer
controlling the minimum number of characters printed. If
the number of characters in the output value is less
than the specified width, blanks are added to the right
of the values (depending on whether the - flag is
specified) until the minimum width is reached. If width
is prefixed with a 0, zeros are added until the minimum
width is reached (not useful, although allowed, for
left-justified numbers).
The width specification never causes a value to be
truncated; if the number of characters in the output
value is greater than the specified width, or width is
not given, all characters of the value are printed.
CLASS Description Range
-----------------------------------------------------------
d Integer -32768 to 32768
u Unsigned_Integer 0 to 65535
r Real Number (*1) 3.4E-38 to 1.7E+308
c Character ASCII 0 to ASCII 255
l Long -2,147,483,648 to 2,147,483,647
x Unsigned_Long 0 to 4,294,967,295
s String (*2) ASCII 0 to ASCII 255
(*1) Internally, Real number have 8 decimal points of
precision but only 2 decimal points will be used for
display purposes.
(*2) A String is a collection of one or more characters
linked together and referenced with one variable.
Example of a character : A
Example of a string : This is a test.
Osiris SE Technical Reference Manual Page 359
_printf Examples :
_printf("This is a string : %s\n",string1);
_printf("This is a integer : %d\n",integer1);
_printf("This is a real : %r\n",real1);
_printf("\n| %40s |\n",string2);
_printf("| %40s |\n\n",string3);
_printf("| %-40s |\n",string2);
_printf("| %-40s |\n\n",string3);
_printf("The time is %02d:%02d",hour,min);
_printf("\a\n%s\n","Press Return To Continue!");
_printf("How's the weather in %s?\n",_CITY);
_printf("%d\n",_ACCESS);
_printf("Final Line of the output display.\n");
Output :
This is a string : Nice way to print isn't it?
This is a integer : 381
This is a real : 1283.21
| This is a test String |
| Hi! |
| This is a test String |
| Hi! |
The time is 02:44
Press Return To Continue!
How's the weather in Cape Girardeau, Mo.?
12
Final Line of the output display.
Osiris SE Technical Reference Manual Page 360
Summary
_Push_into_queue(s1);
s1 : A user defined variable, STRING CLASS or a string
constant.
Description
push_into_queue takes the contents of s1 and places it
in the Osiris command stacking queue.
Example
_push_into_queue("SE400?.ARJ");
_global_download();
Places the wild card file name SE400?.arj in the command
queue and calls the global download function. Since
there is a file name in the queue, global download will
not ask for the name of the file to download, it will
pull it from the command queue.
Osiris SE Technical Reference Manual Page 361
Summary
_Putc(ch);
ch : A user defined variable, CHARACTER CLASS, or a
CHARACTER constant.
Description
The _putc function is a high speed, low overhead, method
of printing a single character to the screen or serial
port.
Example
See _COPY_CH for example on the possible uses of _putc.
Osiris SE Technical Reference Manual Page 362
Summary
_Replace_ch(ch,string,position);
ch : A user defined variable, CHARACTER CLASS, or
a CHARACTER constant.
string : A user defined variable, STRING CLASS.
position : A user defined variable, INTEGER CLASS or an
Integer constant.
Description
_Replace_CH is a high speed function used to replace an
individual character in a string with the character in
ch.
The character to replace is pointed to by position.
Keep in mind that a STRING CLASS is actual made up of
individual CHARACTERS.
The string
SYSOP
is 5 CHARACTERS tied together by the STRING CLASS
declare. But, each individual character can be extracted
and worked with.
SPL/I, even the C programming language, starts labeling
individual characters in a string with 0. That can, at
times, be confusing since we're use to starting things
with a 1.
SYSOP
01234
Y has a position of 1, O has a position of 3.
To replace Y with * and assuming the variable was named
JOHN.
_Replace_CH(*,JOHN,1);
The variable ch, CLASS CHARACTER, now has the contents
of * and
_printf("The 2nd character in your name is now %c\n",ch);
would produce the output
The 2nd character in your name is now *
Osiris SE Technical Reference Manual Page 363
Summary
_Rewind(file);
file : A user defined variable, FILE CLASS
Description
This function repositions the file pointer to the first
character in the file. If the file was opened with
WRITE, the file pointer will AUTOMATICALLY go back to
the end of file if you attempt to write to it.
Example
_define_var(in,file);
_fopen("user.doc",in,read);
_rewind(in);
Osiris SE Technical Reference Manual Page 364
Summary
_Send_file(rtcode,file);
Rtcode : A user defined variable, INTEGER CLASS
file : A user defined variable, STRING CLASS or a
string constant.
Description
This function utilizes the internal Osiris file transfer
system to send the file pointed to by 'file' to the
caller.
Send_file is generally used to send special files that
aren't normally found in one of your download
directories. The file to send must be in the current
directory. If it isn't, use the chdir command to place
yourself in the same directory, don't forget to change
back after the transfer.
The status of the transfer, successful or failed, is
placed in rtcode. A 0 indicates the transfer was
successful. Any other value indicates failure.
Example
_define_var(rtcode,integer);
_assign(rtcode,1);
_while(rtcode);
_send_file(rtcode,"c:\osiris\user.zip");
_if(rtcode);
/* Do something if the file wasn't downloaded */
_endif;
_wend;
Osiris SE Technical Reference Manual Page 365
Summary
_Setdisplay(type);
type : An integer constant, 0 or 1
Description
The Osiris default display screen is 22x80 with the top
line showing serial port information and the bottom two
lines showing user information.
When Osiris runs a SPL/I command file, the display is
set to 25x80, in case WINDOWS are used.
In some cases, autoexec.prg, you may want to switch the
22x80 information display back-on.
_setdisplay(type) lets you decide which display you want
to use. If type is 0, the display will switch to 22x80
information. If type is 1, the display will switch to
25x80 (the default for a SPL/I command file).
E.g.,
_setdisplay(0);
Set to 22x80.
_setdisplay(1);
Set to 25x80.
If you are going to use windows, the display MUST be in
25x80 mode.
Osiris SE Technical Reference Manual Page 366
Summary
_Set_file_area(area);
area : A user defined variable, INTEGER CLASS, or an
integer constant.
Description
This allows you to force a change to a new file area.
The area to change to is taken from the variable, or
constant, area.
This function does NOT check to see if the caller has
access to the area.
Example
_set_file_area(10);
Forces a file area change to area NO. 10.
_set_file_area(newarea);
Forces a file area change to the area NO. contained
within the integer variable "newarea".
Osiris SE Technical Reference Manual Page 367
Summary
_Set_node_status(status);
status : An INTEGER constant
Description
Allows you to set the node status display (who's on-
line) from within a command file. The following
integer constants may be used to indicate the status of
the caller.
1 = Transferring a File
2 = Unavailable for CHAT
3 = In External Program
4 = Available For CHAT
If you change the status, be sure to change it back to
its original state, generally 4.
Example
_set_node_status(3);
Osiris SE Technical Reference Manual Page 368
Summary
_Set_msg_area(area);
area : A user defined variable, INTEGER CLASS, or an
integer constant.
Description
This allows you to force a change to a new conference
area. The area to change to is taken from the variable,
or constant, area.
This function does NOT check to see if the caller has
access to the area.
Example
_set_msg_area(10);
Forces a conference area change to area NO. 10.
_set_msg_area(newarea);
Forces a conference area change to the area NO.
contained within the integer variable "newarea".
Osiris SE Technical Reference Manual Page 369
Summary
_Setcmdkey(string);
string : A string CONSTANT
Description
_setcmdkey lets you switch to a new language cmds key
file, the default is cmds.key.
_setcmdkey requires a string constant containing the
full drive, path, and file name of the new file.
E.g.,
_setcmdkey("C:\osiris\German.key");
_setcmdkey("C:\osiris\FRENCH.key");
Osiris SE Technical Reference Manual Page 370
Summary
_Setlangname(string);
string : A string CONSTANT
Description
_setlangname lets you switch to a new language database,
the default database is cmds.dat.
_setlangname requires a string constant containing the
full drive, path, and file name of the new database.
E.g.,
_setlangname("C:\osiris\German.Dat");
_setlangname("C:\osiris\FRENCH.DAT");
Osiris SE Technical Reference Manual Page 371
Summary
_Setmenupath(string);
string : A string CONSTANT
Description
_setmenupath lets you change to a different MMU/ASC/PRG
subdirectory.
_setmenupath requires a string constant containing the
full drive and path to the new subdirectory. The path
MUST end with a backslash, \.
E.g.,
_setmenupath("E:\MENU\");
_setmenupath("E:\menu\german\");
Notice that each of the paths ended with '\'.
You might use this in conjunction with _setlangname to
switch your menus to a new language whenever you switch
the language database.
Osiris SE Technical Reference Manual Page 372
Summary
_Spawn(program);
PROGRAM : A string variable or string constant.
Description
The _spawn function allows you to execute other SPL/I
command files from the current command file. This
function should be used sparingly and primarily IN
command files that act as centralized menu system for
multiple command files.
Example
_if(ch = 'A');
_spawn("C:\osiris\prgs\infomall.prg");
_endif;
Warning
To give you as much variable space as possible for
the child program, the variable table's pushed onto
the stack and then popped back off when you return.
But, you WILL lose the contents of any string
variable you may have defined. The variable itself
will be restored but the contents cannot be.
This ONLY applies to string variables. The contents
of the other variables will be restored.
If you have a string variable and you want to SAVE
the contents, create a disk file and save the
contents of the variable with fprintf and then
restore it after you return from the child with
fgets.
Osiris SE Technical Reference Manual Page 373
Summary
_Sprint(format);
format : A user defined variable, STRING CLASS, or a
string constant.
Description
The _sprint function is a fast method of printing text
to the serial port and the local display screen.
_sprint has lower overhead than the _printf function but
does have some restrictions. Format cannot include
format specifications but may include escape sequences.
Even thou _sprint is fast, the fastest method of
displaying large amounts of text that do not require
variables is _display_text.
See the section on _display_text for details.
Example
_sprint("This is a test\n");
_sprint(string);
Osiris SE Technical Reference Manual Page 374
Summary
_Sprintf(variable,format{,variable1, Variable2, .....});
Description
Sprintf functionally identical to the printf function,
but the output is placed in a STRING CLASS variable
instead of being sent to the serial port and local
display.
It is used to create strings using multiple variables of
different CLASSES.
Sprintf requires an additional argument, in respects to
the printf function, the destination variable, STRING
CLASS.
See section on printf for a description on:
format{,variable 1,variable 2, .....}.
Example
See sample program segment in the section dealing with
the execute command.
Osiris SE Technical Reference Manual Page 375
Summary
_Storage(name,len);
name : User defined variable, STRING CLASS.
len : User defined variable, INTEGER CLASS.
Description
This function returns the maximum string size this
variable can safely hold.
Do not confuse it with strlen. Strlen returns the length
of the CONTENTS of the variable, while storage returns
the MAXIMUM length of what COULD go in there.
Example
_Define_var(name,string(80));
_define_var(max,integer);
_storage(name,max);
_printf("The variable can hold up to %d characters.\n",max);
The output
The variable can hold up to 80 characters.
Notice the '80' is the same as the '80' in
'_Define_var(name,string(80));'.
Osiris SE Technical Reference Manual Page 376
Summary
_Strcat(string1,string2);
string1 : A user defined variable, STRING CLASS.
string2 : A user defined variable, STRING CLASS, or
string constant.
Description
The strcat function is used to CONCAT to string1 and
string2 to form a new string. The new string is placed
in the first variable, string1.
WARNING
SPL/I does not validate string1. It must be large enough
to hold both strings.
Example
_define_var(s1,string(80));
_define_var(s2,string(40));
_assign(s1,"The"); _assign(s2,"Sysop");
_printf("%s %s\n",s1,s2);
The Sysop
_strcat(s1," ");
_strcat(s1,s2);
_printf("%s",s1);
The Sysop
Osiris SE Technical Reference Manual Page 377
Summary
_Strindex(rcode,string1,string2);
rcode : User defined variable, INTEGER CLASS.
string1: User defined variable, STRING CLASS, or a
string constant.
string2: User defined variable, STRING CLASS.
Description
Strindex is used to determine if string1 is in string2.
Strindex returns the position, or -1 if string1 is not
in string2, in the variable rcode.
Example
_DEFINE_VAR(NAME,STRING(80));
_DEFINE_VAR(X,INTEGER);
_ASSIGN(NAME,_NAME);
_printf("NAME : %s\n",name);
_strindex(X,"SYS",NAME); _printf("%d\n",x);
Produces the output:
NAME : The Sysop
4
SYS is in name, and the starting position is 4.
Keep in mind that individual positions in a STRING CLASS
variable starts at 0
---------
v |
The Sysop |
012345678 |
^---------+------ position 4
|
Sys is --------
Osiris SE Technical Reference Manual Page 378
Example 2
_DEFINE_VAR(NAME,STRING(80));
_DEFINE_VAR(X,INTEGER);
_ASSIGN(NAME,_NAME);
_printf("NAME : %s\n",name);
_strindex(X,"JOHN",NAME);
_elseif(x != -1);
_printf("JOHN is NOT in the string '%s'\n",name);
_else;
_printf("JOHN starts at position %d\n",x);
_EEnd;
Osiris SE Technical Reference Manual Page 379
Summary
_Strlen(string,length);
string : a user defined variable, STRING CLASS
length : a user defined variable, INTEGER CLASS
Description
_Strlen is a function used to determine the length of
the CONTENTS IN the string. The function returns the
length in the variable length.
Example
_define_var(Mike,String(80));
_define_var(len,Integer);
_assign(Mike,"The Sysop");
_strlen(Mike,len);
_printf("The length of the string is %d.\n",len);
Produces the output
The length of the string is 9.
E.g.,
_assign(Mike,"The Sysop");
123456789
Osiris SE Technical Reference Manual Page 380
Summary
_Switch(ch);
_Case(value);
_Break;
_Send;
ch : User defined variable, CHARACTER CLASS or a user
defined variable, INTEGER CLASS.
value : An integer constant or a character constant.
Description
The conditional operator and the elseif construction
make it easy to write programs that choose between
two alternatives. Sometimes, however, a program needs
to choose one of SEVERAL alternatives. We can do this
using elseif, but in many cases it is more convenient
to use the switch statement. Here is an example showing
how it works. This program reads in a letter, then
responds by printing an animal name that begins with
that letter.
_getc(ch,1);
_switch(ch);
_case('A');
_printf("argala, a wild sheep of Asia\n");
_break;
_case('B');
_printf("babirusa, a wild pig of Malay\n");
_break;
_case('C');
_printf("coati, racoon like mammal\n");
_break;
_case('D');
_printf("desman, aquatic, molelike critter\n");
_break;
_case('E');
_printf("echidna, the sphiny anteater\n");
_break;
_default;
_printf("That's a stumper!\n");
_send;
Switch may also use an INTEGER variable. Here is the
same program, but it uses an integer variable instead of
character variable.
Osiris SE Technical Reference Manual Page 381
_getc(ch,1);
_cast(ch,integer);
_switch(ch);
_case(65);
_printf("argala, a wild sheep of Asia\n");
_break;
_case(66);
_printf("babirusa, a wild pig of Malay\n");
_break;
_case(67);
_printf("coati, racoon like mammal\n");
_break;
_case(68);
_printf("desman, aquatic, molelike critter\n");
_break;
_case(69);
_printf("echidna, the sphiny anteater\n");
_break;
_default;
_printf("That's a stumper!\n");
_send;
It might look a little strange and you may be wondering
how in the world 'A' gets to be an integer 65. Well, an
upper case 'A' has the ASCII value of 65. When you it
casted to an integer, the ASCII 65 (uppercase A)
becomes an integer 65.
If you were to cast an integer 66 to character format,
it would become an upper case 'B'.
Osiris SE Technical Reference Manual Page 382
This is how the switch statement works. The express
in the parentheses following word SWITCH is
evaluated. In this case it has whatever value you entered
for ch. Then the program scans the list of "labels"
(case('A'), case('B'), case('C'), etc. in this
instances) until it finds one that matches the
value. The program then jumps to the next line
following the label. What if there is not match? If
there is a line labeled "default", it must be the last
one, the program jumps there.
The "break" signals the END of the body of statements
associated with LABEL.
If you are familiar with Pascal, you will recognize the
switch statement as being similar to the Pascal CASE
statement. The most important difference is that the
SWITCH statement requires the use of a _BREAK if you
want only the labeled statement(s) to be processed.
The SWITCH labels must be a character or integer
constant. You cannot use a variable for a label.
When should you use a SWITCH and when should you use the
elseif construction? Often you don't have a choice. You
can't use a switch if your choice is based on evaluating
a REAL, LONG variable or expression. Nor can you a
SWITCH if the variable must fall into a certain range.
It is simple to write
_if(ch < 200 .AND. ch > 2)
but covering this possibility with a switch would
involve setting up case labels for each ch from 3
to 199. However if you can use SWITCH, your program
will run more efficiently.
Osiris SE Technical Reference Manual Page 383
Summary
_Sysdate(year,month,day);
Year,
Month,
Day : User defined, INTEGER CLASS, variables.
Description
The function _sysdate places the current system date in
year,month, and day.
Example
_Define_VAR(Y,INTEGER);
_DEFINE_VAR(M,INTEGER);
_DEFINE_VAR(D,INTEGER);
_SysDate(Y,M,D);
_PRINTF("The current date is : %d/%d/%d\n",m,d,y);
produces the output
The current date is : 12/23/1991
If you want a two digit year
_SysDate(Y,M,D);
_MATH(Y = Y - 1900);
_PRINTF("The current date is : %d/%d/%d\n",m,d,y);
produces the output
The current date is : 12/23/91
Osiris SE Technical Reference Manual Page 384
Summary
_Systime(h,m,s,hu);
H,
M,
S,
HU : User defined variables, INTEGER CLASS
Description
This function retrieves the current system time in HOUR,
MINUTE, SECOND, HUNDRED SECOND format and stores it in
the user defined variables.
Example
_DEFINE_VAR(HOUR,INTEGER);
_DEFINE_VAR(MINUTE,INTEGER);
_DEFINE_VAR(SECOND,INTEGER);
_DEFINE_VAR(HUND,INTEGER);
_SYSTIME(HOUR,MINUTE,SECOND,HUND);
_PRINTF("The time is : %02d:%02d:%02d.%d\n",HOUR,MINUTE,SECOND,HUND);
produces the output
The time is : 02:23:45.77
Time is returned in 24 hour format. If you would rather
display it in AM/PM format. . .
_DEFINE_VAR(HOUR,INTEGER);
_DEFINE_VAR(MINUTE,INTEGER);
_DEFINE_VAR(SECOND,INTEGER);
_DEFINE_VAR(HUND,INTEGER);
_SYSTIME(HOUR,MINUTE,SECOND,HUND);
_ELSEIF(HOUR > 12);
_MATH(HOUR = HOUR - 12);
_PRINTF("The time is : %02d:%02d:%02d PM\n",HOUR,MINUTE,SECOND);
_ELSE;
_PRINTF("The time is : %02d:%02d:%02d AM\n",HOUR,MINUTE,SECOND);
_EEND;
Osiris SE Technical Reference Manual Page 385
Summary
_Timerset(v1,1000);
v1 : User defined variable, LONG CLASS.
Description
This function can be used to track elapse time and can
be quite helpful when it comes to optimizing your code.
You may also use this function to LIMIT time spent in a
certain section of your program.
_timerset requires two arguments, a long integer to
store the current time in, and a long constant.
If you are going to use timerset to track elapse time,
the long constant should always be 0.
If you are going to use timerset to limit the time spent
in a certain section of your program, the long constant
should be the amount of time you want to limit the
caller to, in CLOCK TICS.
There are 100 clock tics to a second; 200 would be 2
seconds, 500 would be 5 seconds, 30000 would be 30
seconds, etc.
Examples
To figure elapse time:
_define_var(start,Long);
_define_var(finish,long);
_define_var(elapse,long);
_timerset(start,0);
_timerset(finish,0);
_math(elapse = finish - start / 100);
_printf("Elapse time : %l Seconds\n",elapse);
Osiris SE Technical Reference Manual Page 386
Summary
_Timeup(v1,rtcode);
v1 : User defined variable, LONG CLASS
rtcode : User defined variable, INTEGER CLASS
Description
Timeup can be used in conjunction with timerset to limit
the amount of time you can stay in a specific section of
code.
Timeup requires two variables; The first is a long (the
one you used with timerset) and the second is an
INTEGER. If the time has expired, timeup will place 1 in
rtcode. If the time has not expired, timeup will place 0
in rtcode.
Example
_define_var(time,long);
_define_var(rtcode,integer);
_timerset(time,30000);
_assign(rtcode,0);
_while(rtcode = 0);
_timeup(time,rtcode);
_wend;
This would hold you in the while loop for 30 seconds.
Osiris SE Technical Reference Manual Page 387
Summary
_Unlink(file);
file : User defined variable, STRING CLASS, or a string
constant.
Description
Deletes "file" from your disk. Identical to the dos DEL
command so be careful. Wild cards are supported so don't
let a caller loose with this command or you may not have
a hard drive when you get up in the morning.
Example
unlink("-TMP.!!!");
Osiris SE Technical Reference Manual Page 388
Summary
_While(expression......);
body
_Wend;
A while state has four distinct parts. First is the
keyword _while. Then, in parentheses, comes a test
condition (the expression) or multiple test conditions.
The body, a series of commands, and finally the _WEND.
Expression(s) work like the expressions for the _IF
functions. See the section on _IF for further details.
-------------<------------------<---
| |
v TRUE |
WHILE ---> [EXPRESSION(S)] -------> BODY ----> _WEND -
|
| False
v
First Statement following _WEND
The while statement belongs to a class of statements
sometimes called "structured statements" because they
posses a structure more complex than a simple _IF
statement.
Osiris SE Technical Reference Manual Page 389
Windows Summary
_Openwindow(win#,ur,uc,lr,lc,border_type,border_color);
_Closewindow(win#);
_Clearwindow(win#);
win# : An INTEGER constant, 1 - 10.
ur,
uc,
lr,
lc,
border_type,
border_color : Integer CONSTANTS.
Description
The openwindow function utilizes ANSI to create a WINDOW
on the screen. It saves the area under the window and a
call to closewindow will restore the area.
The parameter WIN# is an integer CONSTANT (not a
variable) used to identify the window, you may use the
values 1 through 10. If you make a call to clearwindow
or to closewindow, you have to pass this WIN# so those
functions will know WHICH window to close, if more than
one is open.
UR and UC points to the upper row and upper left column
of the window. LR and LC point to the lower row and
lower RIGHT column of the window, not including border.
Valid rows values are : 2 - 24
Valid column values are : 2 - 79
The screen is actual 1-25 and 1 - 80, but space must be
reserved for the border.
You may specify the TYPE of border, single or double
line, you want using "border_type". A 0 will generate a
single line border and 1 will generate a double line
border.
Border_color tells me which foreground color to use for
the border.
Valid border colors range from 0 (black) to 31 (blinking
bright white). See section on "color()" for a full list
of values and their corresponding colors.
Openwindow does NOT save the current cursor location,
see section on _curget and _locate, nor does it
validate the parameters passed to it.
Osiris SE Technical Reference Manual Page 390
You have two possible problem areas when using windows.
The first is monitor mismatching. If you do color, you
must use a color monitor on the BBS or you have to
select your colors carefully. When the closewindow
function is called, it will restore the section under
the window and then read that section so it can send the
same colors/characters to the remote screen. A
monographic screen does not use the same color codes
that a color screen will and the screen may not restore
to your INTENDED colors.
The second problem area is placement. Doing a window
without clearing the screen, a slash command for
instances, will not restore the proper area on the
remote screen because your BBS screen is smaller, by 3
lines, than the callers. This is due to the TOP and two
BOTTOM status lines Osiris keeps on the screen all the
time.
_closewindow(WIN#) closes the window pointed to by WIN#
and restores the screen area beneath the window to its
original state.
_clearwindow(WIN#) clears the window pointed to by WIN#.
Osiris SE Technical Reference Manual Page 391
Example
_define_var(s1,string(30));
_define_var(ch,character);
_define_var(row,integer);
_define_var(col,integer);
_define_var(not_done,integer);
_define_var(not_valid,integer);
_assign(not_done,1);
_while(not_done);
_cls();
_display_text("d:\itp\m.ans");
_assign(not_valid,1);
_while(not_valid);
_sprint("
Selection ? ");
_gets(s1,1);
_copy_ch(ch,s1,0);
_sprint("\r \r");
_elseif(ch != 'L');
_curget(row,col);
_call(errormsg);
_locate(row,col);
_else;
_clear(not_valid); _clear(not_done);
_eend;
_wend;
_wend;
_mend;
_procedure(errormsg);
_openwindow(1,8,22,10,51,1,13);
_locate(8,22);
_sprint("That Is ");
_color(30);
_sprint("\aNOT ");
_color(7);
_sprint("a valid selection.");
_locate(10,25);
_sprint("Press RETURN to Continue");
_getc(ch,0);
_closewindow(1);
_sprint("");
_pend;
Osiris SE Technical Reference Manual Page 392
Spl/I Database System
SPL/I supports user defined flat databases with a primary
key field, using an eight level memory based high speed
Btree indexing system.
Number Of Fields
SPL/I does not limit you to a specific number of
fields. A database record can consist of 1 field or
999 fields. The only limit SPL/I places on a database
record is overall size. The record can be no larger
than 1000 bytes. You are however, limited to only one
index field.
The best way to teach you about database construction is to
take you though the process of setting up a simple database
so . . .
Defining A Database
The first step in setting up an SPL/I database is simple
and one that can't be skipped. Set down at the table with a
pencil and paper and decide on exactly WHAT you are going to
put in a record.
For this tutorial, we'll use the vetlink database found on
VL3. The vetlink database is will list BBS' around the
country that carry a specific echomail conference. We want to
let people log on and find the closest system in their area
so they don't have to call long distance.
The first step is to list, on paper, exactly what we want
to store in each record.
We want:
The BBS' name, Phone No., and The City and State the BBS is
located in.
The next step is to figure out what piece of information the
caller WILL know that we can use for a KEY to find the
correct record.
If you are looking for something in your area, then you'll
more than likely know the AREA CODE for that area. Ok, we got
that in the phone number field. But, that means we can't put
the WHOLE phone number in one field. If you knew the whole
phone number, there wouldn't be any need for the database.
Osiris SE Technical Reference Manual Page 393
So, we're going to have to split the phone number so the
area code can have its own field and can act as our primary
index field.
The BBS' name
Area Code
Rest of the phone number.
City and State.
That'll work just fine, but...lets think things though a
little more. It might be nice if you could enter a City or
State and find the BBS that way, since those would be KNOWN
factors. And what about breaking the search down into area
code and dial prefix? The dial prefix would certainly be a
KNOWN factor.
Ok, now we have:
The BBS' name
Area Code
Prefix
Suffix
City
State
There, now we've broken each piece of information down so
that possible KNOWN factors can have their own fields and I
think we're ready to go to the next step.
Before we proceed, look back at the last paragraph. "KNOWN"
is very important. ALL database systems must have at least
ONE KNOWN factor. Without that, there is no way you can come
up with a record.
Now that we know what we what to put into each field and we
know that the "Area Code" is going to be our primary index
field, we need to decide just how BIG each field has to be.
Knowing how large to make a field can sometimes be as tricky
as deciding on what fields to use. Lets take "The BBS' name".
We don't KNOW how large a field to make because we can't
predict what someone else is going to do, name wise. So we
have to decide how much space we're going to allow and we'll
just have to truncate anything that exceeds that length. Lets
say we'll allow upto 40 characters for the BBS name. That
should be more than enough for most BBS'.
Osiris SE Technical Reference Manual Page 394
Rule 1: Always add 1 to any field length as a safety cushion.
Field 1, BBS name - 41 Characters.
The next field is "AREA CODE" and that's an easy one. We know
all area codes have 3 digits so field #2 will be 4
characters, remember Rule 1?
Field 2, Area code - 4 Characters.
The next field, prefix, is also has a known length, 3
digits.
Field 3, Prefix - 4 Characters.
We're in luck, the fourth field "Suffix" also has a known
length (for the United States) 4 digits.
Field 4, Suffix - 5 Characters.
Field 5, City, is like the first field, BBS name, and like
the BBS name, we'll just have to decide how much space we're
going to allow. Generally, 26 characters will handle about
any CITY name you're likely to encounter.
Field 5, City - 27 Characters.
Field 6 has a known length, 2 characters.
Field 6, State - 3 Characters.
NOTE: When you actual create the database, OSM will ask for
field length and not characters. In this case, number of
characters is the field length.
Our final step is the name. Each database has to have a
unique 8 character name, this does not include the extension.
When creating database names, never include any type of
file extension, those are automatically added for you.
In this case, we'll call the database VETLINK
Now that we have written ALL of this on our piece of paper,
we're ready to create the actual database and we have to use
OSM for that.
Under the primary menu option "DBASE", you'll find a sub-
option called "MAKE DB". Select this option to create the
database.
The first question will be "Number of fields". We go back to
our piece of paper and count the fields and we come up with
6 so, enter that number.
Osiris SE Technical Reference Manual Page 395
The next six questions will be "Enter Length Field #X" with X
being the actual field number. Again, reference you're paper
and enter the number characters you wrote down for that
field.
E.g.,
41
4
4
5
27
3
The next question will be "Use which field as Index ?". We
decided that AREA code would be the field we'd use as our
primary index and AREA code is field #2.
The final question, the name to use for the database. We
decided on VETLINK so type that in.
Ok, now that we have created the database how do we put
information in it?
Create a text file, name doesn't matter but we'll use
DATA.TXT for this example.
Each line of the text file will be a RECORD in our database.
Each field will be separated by @. Since our database record
contains six fields, a line in the text file would look
something like this:
The Cat's Lair@314@334@6359@CAPE GIRARDEAU@MO@
^ ^ ^ ^ ^ ^
| | | | | |
Field 1 | | | | |
Field 2 | | | |
Field 3 | | |
Field 4 | |
Field 5 |
Field 6
After you add all the records to this text file, run OSM and
under the DBASE option, you'll find a sub-option called "ADD
DB".
When you select this option, the first question will be the
name of the database, VETLINK. Remember not to use any type
of file extension.
The next question will be the name of the text file, data.txt
in this case.
Osiris SE Technical Reference Manual Page 396
That's it. OSM will take the text records out of data.txt and
import them into the database.
This is not the only way to get records into a database, but
90 percent of all databases will use this method.
Now we have our database and we have data in it so the final
step will be to create an SPL/I command file that allows
callers to access the data.
Creating Vetlink.scr
The first order of business is to OPEN the database so
_OPENDATABASE("C:\OSIRIS\VETLINK");
Notice I did not use a file extension.
Now we need some form of loop that will keep you in the
vetlink program until YOU decide to quit.
_DEFINE_VAR(NOT_DONE,INTEGER);
_ASSIGN(NOT_DONE,1);
_WHILE(NOT_DONE);
_WEND;
_MEND;
I've used a while loop and a variable called not_done, which
pretty much explains the entire loop.
I've assigned not_done the value of 1 and when the while
'expression' is evaluated, it will evaluate TRUE because a
value in a single variable that is not 0 (Zero) always
evaluates TRUE.
To kill the loop, all I have to do is change the value in
NOT_DONE to 0. The 'expression' would evaluate FALSE and I'd
drop out of the loop. Neat, clean, and simple.
You'll also notice the FIRST thing I did after the _WEND was
to close the database. ALWAYS close a database before leaving
a command file. Failing to close a database can cause all
kinds of problems.
Osiris SE Technical Reference Manual Page 397
Put everything together and we have:
_OPENDATABASE("C:\OSIRIS\VETLINK");
_DEFINE_VAR(NOT_DONE,INTEGER);
_ASSIGN(NOT_DONE,1);
_WHILE(NOT_DONE);
_WEND;
_closedatabase();
_MEND;
The first thing I want to do in the loop is display the menu
and get your selection. Since I'm going to get a selection, I
need to also define a variable to hold it. I'll add that
before the loop. If I put the define inside the loop, I'd be
redefining the same variable every time the loop cycled and
sooner or later the computer would crash with an out of
memory error.
Since I'm going for single character input, the variable
only needs to hold 1 character. The CHARACTER CLASS variable
fits that to a tee. The name, well I like CH for character
class variables so I'll use that.
_OPENDATABASE("C:\OSIRIS\VETLINK");
_DEFINE_VAR(NOT_DONE,INTEGER);
_DEFINE_VAR(CH,CHARACTER);
_ASSIGN(NOT_DONE,1);
_WHILE(NOT_DONE);
_WEND;
_closedatabase();
_MEND;
Osiris SE Technical Reference Manual Page 398
Next step is to put the menu, the input prompt, and the input
command inside the loop:
_OPENDATABASE("C:\OSIRIS\VETLINK");
_DEFINE_VAR(NOT_DONE,INTEGER);
_DEFINE_VAR(CH,CHARACTER);
_ASSIGN(NOT_DONE,1);
_WHILE(NOT_DONE);
_CLS();
_sprint("A) Within A Specific Area Code\n");
_sprint("B) Within A Specific City\n");
_sprint("C) Within A Specific State\n\n");
_sprint("Q) Quit \n\n");
_sprint("Enter Selection ? ");
_getc(ch,1);
_WEND;
_closedatabase();
_MEND;
I've elected to use the _sprint function to print the menu.
You could use any one of half a dozen methods, but this one
is the simplest.
Notice the _getc(ch,1) . . . To simplify processing, I'm only
going to test for an UPPERCASE responses. The 1 forces
anything you type to UPPERCASE.
E.g., 'A' and 'a' are not the same. If I were to test for 'A'
and you enter 'a', the test would fail. The 1 guarantees that
your 'a' will be converted to 'A' before I get it.
Ok, now that I have the database open, I've got you inside a
loop that displays a menu and gets come type of single
character response, I got to do something with it.
Using ELSEIF may be the easiest way to handle this
particular program, given the limited number of options, so
let's put in some elseif statements to determine if you
entered a valid selection; A, B, C, or Q.
Osiris SE Technical Reference Manual Page 399
_OPENDATABASE("C:\OSIRIS\VETLINK");
_DEFINE_VAR(NOT_DONE,INTEGER);
_DEFINE_VAR(CH,CHARACTER);
_ASSIGN(NOT_DONE,1);
_WHILE(NOT_DONE);
_CLS();
_sprint("A) Within A Specific Area Code\n");
_sprint("B) Within A Specific City\n");
_sprint("C) Within A Specific State\n\n");
_sprint("Q) Quit \n\n");
_sprint("Enter Selection ? ");
_getc(ch,1);
_cls();
_elseif(ch = 'A');
_else;
_elseif(ch = 'B');
_else;
_elseif(ch = 'C');
_else;
_elseif(ch = 'Q');
_else;
_eend;
_eend;
_eend;
_eend;
_WEND;
_closedatabase();
_MEND;
Osiris SE Technical Reference Manual Page 400
TIP: When you nest ELSEIF statements, always enter all three
sections
_ELSEIF();
_ELSE;
_EEND;
in a row before doing ANYTHING else. That way, you'll always
have the correct number of matching ELSE's and EEND's to go
with the ELSEIF's. Then you can go in-between and add the
rest of the code.
We'll add each option as a procedure rather than stick it
between the correct ELSEIF and ELSE so things are easier to
read.
Lets take the most obvious one, ELSEIF(CH = 'Q'), first.
Osiris SE Technical Reference Manual Page 401
_OPENDATABASE("C:\OSIRIS\VETLINK");
_DEFINE_VAR(NOT_DONE,INTEGER);
_DEFINE_VAR(CH,CHARACTER);
_ASSIGN(NOT_DONE,1);
_WHILE(NOT_DONE);
_CLS();
_sprint("A) Within A Specific Area Code\n");
_sprint("B) Within A Specific City\n");
_sprint("C) Within A Specific State\n\n");
_sprint("Q) Quit \n\n");
_sprint("Enter Selection ? ");
_getc(ch,1);
_cls();
_elseif(ch = 'A');
_else;
_elseif(ch = 'B');
_else;
_elseif(ch = 'C');
_else;
_elseif(ch = 'Q');
_clear(not_done);
_else;
_eend;
_eend;
_eend;
_eend;
_WEND;
_closedatabase();
_MEND;
Osiris SE Technical Reference Manual Page 402
If 'Q' is selected, all I have to do is clear NOT_DONE (set
it to 0) and you'll drop out of the loop. The while
'expression' will evaluate FALSE ( 0 always evaluates
false with single expression tests) , the database will be
closed, and the command file will stop executing, _MEND.
The next step, picking out the names of the procedures we
will use for the remaining three option. Try to use something
that reflects the procedures purpose, it'll be easier to
read.
I think we'll use: FINDAREA, FINDCITY, and FINDSTATE.
Having decided on the names, lets add call statement to what
we have in the appropriate ELSEIF spots:
Osiris SE Technical Reference Manual Page 403
_OPENDATABASE("C:\OSIRIS\VETLINK");
_DEFINE_VAR(NOT_DONE,INTEGER);
_DEFINE_VAR(CH,CHARACTER);
_ASSIGN(NOT_DONE,1);
_WHILE(NOT_DONE);
_CLS();
_sprint("A) Within A Specific Area Code\n");
_sprint("B) Within A Specific City\n");
_sprint("C) Within A Specific State\n\n");
_sprint("Q) Quit \n\n");
_sprint("Enter Selection ? ");
_getc(ch,1);
_cls();
_elseif(ch = 'A');
_CALL(FINEAREA);
_else;
_elseif(ch = 'B');
_CALL(FINDCITY);
_else;
_elseif(ch = 'C');
_CALL(FINDSTATE);
_else;
_elseif(ch = 'Q');
_clear(not_done);
_else;
_eend;
_eend;
_eend;
_eend;
_WEND;
_closedatabase();
_MEND;
Now that we have the MAIN section of the program done, we get
to the tricky part, the procedures that actual access the
database.
The first procedure we'll do is FINDAREA and we start by
declaring the procedure with
_procedure(areacode);
Osiris SE Technical Reference Manual Page 404
We're also going to need some variables to work with so we'll
declare those. I'll explain what each one is for as we use
it.
_define_var(acode,string(10));
_define_var(ocode,string(10));
_define_var(rtcode,integer);
First step is to get the area code from the caller. Since the
area code is a 3 character or digit field, we'll use the
masked_input command to limit input to 3 characters. We'll
also use a 999 mask to force the caller to enter numbers and
not letters.
_sprint("List systems in which area code ? ");
_masked_input(1,acode,"(999)");
Ok, we've got the input now lets see if there is an INDEX KEY
that matches the area code. The function _LoadRecord is used
to load the first record that matches the key. If it
successfully loads a record, it sets the RTCODE variable to
1. If it doesn't it sets the code to 0.
The correct syntax for _loadrecord is:
_LoadRecord(rtcode,acode);
The key field, acode (what the caller typed in and the area
code he is looking for) is the second variable. All KEY
fields must be entered in a STRING CLASS variable. You can
CAST the fields contents into any VARIABLE CLASS once the
record has been loaded.
NOTE: You don't have to use those exact variable names, you
can use any name you want.
We now have:
_procedure(areacode);
_define_var(acode,string(10));
_define_var(ocode,string(10));
_define_var(rtcode,integer);
_sprint("List systems in which area code ? ");
_masked_input(1,acode,"(999)");
_LoadRecord(rtcode,acode);
Osiris SE Technical Reference Manual Page 405
Because there may be more than one record that matches the
key, we can't simply print the record and return. We have to
setup a loop that repeatedly displays the current record and
gets the next record. We also have to use something to
determine when the next record no longer matches the key.
Since _LoadRecord and GetNextRecord always place 1 in RTcode
, if a record was loaded, that's a good variable to use for
LOOP control. There are other methods, but this one is as
good as any.
_while(rtcode);
_wend;
The section of code inside the loop should display the
current record and get the next record. It must also do the
test to determine WHEN we need to exit the loop.
You could put the display code inside the loop itself, but
since all three of our procedures will be displaying a
record, it would require less code if we put the display
record in its own procedure and just call it from the other
three, so we will and we'll call that procedure DISPLAY.
Because we loaded the first record before entering the loop,
the first thing we do INSIDE the loop is display the record.
_while(rtcode);
_call(display);
_wend;
The next step is to get the next record. We can't use the
LOADRECORD call a second time because it would located the
first record that matched and we'd just continue looping,
displaying the same record over and over and over and over
and .........
But, if there are multiple records with the SAME key, they
will always be GROUPED together. After we find the first one
with _LOADRECORD, a call to the function _GETNEXTRECORD will
load the next available record. It may or it may not match
the KEY and that's what we have to determine.
Osiris SE Technical Reference Manual Page 406
So . . .
_while(rtcode);
_call(display);
_GetNextRecord(rtcode);
_if(rtcode);
_endif;
_wend;
We need to CHECK rtcode after the call to GETNEXTRECORD just
in case the first matching key was the LAST record in the
database. If it was, then we don't need to do anything
because RTcode will be 0 and the _while loop will terminate.
If RTcode does contain 1, we have to determine if the key
field matches what we want. It could be the first record of a
NEW group of area codes.
We can't directly work with a database field so we have to
move it to a variable we can work with. That's why I defined
ocode. Ocode is a duplicate, defined using the same type of
define_var, as the original acode (string used to get the
key, area code, from the caller).
The function copyfrom is use to move the contents of the
database field to the variable.
E.g., Copyfrom(ocode,2);
^
|
--------------
|
Field 2 contains the area code.
The variable ocode now contains the area code field from the
current database record.
Now we have to compare ocode with the original acode. If they
match, then we have another record that matches the key. If
they don't match, that means we've hit the next group of area
codes and we need to terminate the search. We'll use the _IF
function to evaluate the test expression.
_if(ocode != acode);
_clear(rtcode);
_endif;
Osiris SE Technical Reference Manual Page 407
Put it all together and we have:
_procedure(areacode);
_define_var(acode,string(10));
_define_var(ocode,string(10));
_define_var(rtcode,integer);
_sprint("List systems in which area code ? ");
_masked_input(1,acode,"(999)");
_LoadRecord(rtcode,acode);
_while(rtcode);
_call(display);
_GetNextRecord(rtcode);
_if(rtcode);
_Copyfrom(ocode,2);
_if(ocode != acode);
_clear(rtcode);
_endif;
_endif;
_wend;
_pend;
A procedure that will get the key from the caller, load the
first matching record and loops, display each record until we
hit an area code that doesn't match what we're looking for.
At that point, you return to the main menu.
You might ask, what if _loadrecord() fails to find the first
matching key?
Nothing, RTCODE is set to 0 and the while loop is never
entered. You'll simply return to the main menu.
The next procedure we'll tackle is findcity. We start it the
same way we did the findarea procedure.
_procedure(findcity);
_define_var(city,string(27));
_define_var(ocity,string(27));
_define_var(rtcode,integer);
This is almost identical to the findarea procedure except I
used slightly different names, more suited to what this
procedure does.
Like the findarea procedure, the first step is to get the
name of the city the caller wants to search for.
_sprint("What City ? ");
_gets(city,26);
Osiris SE Technical Reference Manual Page 408
Instead of the masked_input command, I used gets. You could
use masked_input, but I wanted to show you a different
method.
Since CITY is not the index field, we can't use the
LOADRECORD command, it only works on the INDEX field.
When you search on a non-indexed field, you have to start
with the first record in the database and look at every
single record. Non-indexed searching is not exactly the
fastest method of locating a record, but your more complex
searches generally have to use this method, even with
database programs like Dbase IV or RBASE 5000.
To load the first record in the database, we use the function
_SetToFirstRecord. Unlike _loadrecord, settofirstrecord does
NOT set RTCODE, there is no possible error because there will
always be a first record, so you will have to set rtcode to 1
so the while loop will execute.
_assign(rtcode,1);
Ok, we now have
_procedure(findcity);
_define_var(city,string(27));
_define_var(ocity,string(27));
_define_var(rtcode,integer);
_sprint("What City ? ");
_gets(city,26);
_assign(rtcode,1);
_SetToFirstRecord();
The rest of the procedure is almost identical to FINDAREA,
with a few small changes.
The city is held in field 5 so
_copyfrom(ocity,5);
Since we're going to search from the first record to the very
last record, we don't need the test
_if(ocity != city);
_clear(rtcode);
_endif;
We'll just let the getnextrecord terminate the while loop
when it reaches the last record.
Osiris SE Technical Reference Manual Page 409
Because we're loading and looking at each record, we do have
to test the record to see if it matches what we're looking
for so we need
_if(ocity = city);
_call(display);
_endif;
If it matches THEN display the record.
The entire procedure:
_procedure(findcity);
_define_var(city,string(27));
_define_var(ocity,string(27));
_define_var(rtcode,integer);
_sprint("What City ? ");
_gets(city,26);
_assign(rtcode,1);
_SetToFirstRecord();
_while(rtcode);
_copyfrom(ocity,5);
_if(ocity = city);
_call(display);
_endif;
_GetNextRecord(rtcode);
_wend;
_pend;
Osiris SE Technical Reference Manual Page 410
The last procedure we have to setup, for the menu, is
FINDSTATE.
FINDSTATE is almost IDENTICAL to FINDCITY, with a couple of
obvious differences so I'm not going to explain it, but I
will display it.
_procedure(findstate);
_define_var(state,string(3));
_define_var(ostate,string(3));
_define_var(rtcode,integer);
_sprint("List systems in which State ? ");
_masked_input(1,state,"AA.");
_SetToFirstRecord();
_assign(rtcode,1);
_while(rtcode);
_copyfrom(ostate,4);
_if(ostate = state);
_call(display);
_endif;
_GetNextRecord(rtcode);
_wend;
_pend;
The Last procedure our program needs is DISPLAY. The first
steps, define the procedure and setup the variables we'll use
in this procedure. The procedure isn't complicated and so
there isn't any need for a detailed explanation. Look at it
and then I'll touch on a few of things that might confuse
you.
Osiris SE Technical Reference Manual Page 411
_procedure(display);
_define_var(s1,string(81));
_define_var(a1,integer);
_define_var(b1,integer);
_define_var(c1,integer);
_define_var(mask,string(81));
_cls();
_copyfrom(s1,1);
_printf("BBS : %s\n",s1);
_copyfrom(a1,2);
_copyfrom(b1,3);
_copyfrom(c1,4);
_sprintf(s1,"%d%d%d",a1,b1,c1);
_make_mask(mask,s1,"(999) 999-9999");
_printf("%s",mask);
_printf("PHONE : %s\n",mask);
_copyfrom(s1,5);
_printf("CITY : %s\n",s1);
_copyfrom(s1,6);
_sprint("STATE : %s\n\n",s1);
_printf("Press any key to continue ");
_getc(ch,0);
_cls();
_pend;
The section
_copyfrom(a1,2);
_copyfrom(b1,3);
_copyfrom(c1,4);
moves the contents of fields 2,3,4 to their respective
variables which I defined as INTEGER CLASS variables. I did
this to show you how field casting works.
Since the numeric values of fields 2,3, and 4 will fit in an
INTEGER class variable, I decided to CAST the fields into
those types of variables and then use the make_mask to create
a display string in the format of (314) 334-6359, assuming
that phone number was in this record.
You could have done:
_copyfrom(s1,2);
_printf("(%s) ",s1);
_copyfrom(s1,3);
_printf("%s",s1);
_copyfrom(s1,4);
_printf("-%s\n\n",s1);
The results would be the same.
Osiris SE Technical Reference Manual Page 412
Spl/I, A Functional Example
Below is the Quick Service LOGON SPL/I command file used on
Vetlink #3, one of our systems. This is a complete SPL/I
command program.
_define_var(s1,string(81));
_define_var(dirty,integer);
_define_var(ch,character);
_define_var(not_done,integer);
_define_var(row,integer);
_define_var(col,integer);
_define_var(rtcode,integer);
_define_var(baud,integer);
_define_var(node,integer);
_define_var(serial,integer);
_define_var(first_time,integer);
_assign(first_time,1);
_assign(node,_NODE);
_assign(serial,_PORT);
_assign(not_done,1);
_assign(baud,_BRATE);
_assign(dirty,1);
_cls();
_while(not_done);
_if(_ANSI = 0 .OR. dirty = 1);
_display_text("w4");
_endif;
_assign(dirty,1);
_elseif(_ANSI);
_sprint(" ");
_color(2);
_sprint("What'll it be ( ");
_color(30);
_sprint("X = Main BBS Program ");
_color(2);
_sprint(") ");
_color(15);
_sprint("? ");
_color(7);
_if(first_time);
_curget(row,col);
_clear(first_time);
_call(specialmsg);
Osiris SE Technical Reference Manual Page 413
_locate(row,col);
_endif;
_getc(ch,1);
_sprint("\r \r");
_curget(row,col);
_else;
_sprint(" What'll it be ( X = Main BBS Program ) ? ");
_getc(ch,1);
_eend;
_elseif(ch = 'X');
_clear(not_done);
_else;
_elseif(ch = 'I');
_push_into_queue("I512?.ARJ");
_cls();
_global_download();
_else;
_elseif(ch = 'O');
_push_into_queue("SE302?.ARJ");
_cls();
_global_download();
_else;
_elseif(ch = 'T');
_push_into_queue("Tmod???.ARJ");
_cls();
_global_download();
_else;
_elseif(ch = 'D');
_display_text("help");
_else;
_elseif(ch = 'A');
_push_into_queue("arcshell.ARJ");
_cls();
_global_download();
Osiris SE Technical Reference Manual Page 414
_else;
_elseif( ch = '?');
_display_text("c:\osiris\welcome4.scr");
_printf("\nPress any key to continue.\n");
_getc(ch,0);
_cls();
_else;
_elseif(ch = 'L');
_post_msg_to_sysop();
_drop_carrier();
_cls();
_else;
_elseif(ch = 'G');
_send_file(rtcode,"user.zip");
_else;
_elseif(ch = 'P');
_drop_carrier();
_else;
_elseif(ch = 'C');
_cls();
_sprintf(s1,"tntbbs -B %d -P %d -N %d",baud,serial,node);
_execute(640,s1,rtcode);
_else;
_elseif(ch == 'V');
_call(vetlink);
_else;
_call(errormsg);
_if(_ANSI);
_locate(row,col);
_clear(dirty);
_endif;
_eend;
_eend;
_eend;
_eend;
Osiris SE Technical Reference Manual Page 415
_eend;
_eend;
_eend;
_eend;
_eend;
_eend;
_eend;
_eend;
_wend;
_cls();
_Mend;
_procedure(errormsg);
_if(_ANSI);
_openwindow(1,8,22,10,51,1,13);
_locate(8,22);
_sprint("That Is ");
_color(30);
_sprint("\aNOT ");
_color(7);
_sprint("a valid selection.");
_locate(10,25);
_sprint("Press RETURN to Continue");
_getc(ch,0);
_closewindow(1);
_sprint("");
_Endif;
_pend;
_procedure(specialmsg);
_openwindow(1,8,15,15,52,1,13);
_locate(8,15);
_color(15);
_sprint("Some of our special services, mostly");
_locate(9,15);
_sprint("slash commands located at the main");
_locate(10,15);
_sprint("menu will be down for a few days while");
_locate(11,15);
_sprint("we change them over to the new format.");
_locate(13,15);
_sprint("Thank you.");
Osiris SE Technical Reference Manual Page 416
_locate(15,21);
_sprint("Press any key to continue.");
_getc(ch,0);
_closewindow(1);
_sprint("");
_pend;
_procedure(vetlink);
_define_var(not_done,integer);
_define_var(row,integer);
_define_var(col,integer);
_define_var(dirty,integer);
_assign(dirty,1);
_opendatabase("Vetlink");
_assign(not_done,1);
_while(not_done);
_if(dirty);
_clear(dirty);
_cls();
_sprint("C
VETLINK III\n");
_sprint("C
Presents\n");
_sprint("C
VIETNAM_VET DISTRIBUTION DATABASE\n\n");
_sprint("C
A
. List BBS Systems In A Specific Area Code.\n");
_sprint("C
S
. List BBS Systems In A Specific State.\n");
_sprint("C
C
. List BBS Systems In A Specific City.\n\n");
_sprint("C
Q
. Quit VIETNAM_VET Echo Distribution System.\n\n");
_curget(row,col);
_math(col = col + 11);
_endif;
_locate(row,col);
_color(2);
_sprint("Selection Please ");
_color(15);
_sprint("? ");
_color(7);
_getc(ch,1);
_locate(row,col);
_sprint(" ");
_elseif(ch = 'A');
_call(areacode);
_else;
_elseif(ch = 'S');
_call(findstate);
_else;
_elseif(ch = 'C');
Osiris SE Technical Reference Manual Page 417
_call(findcity);
_else;
_elseif(ch = 'Q');
_clear(not_done);
_else;
_call(errormsg);
_eend;
_eend;
_eend;
_eend;
_wend;
_cls();
_CloseDataBase();
_Pend;
_procedure(areacode);
_define_var(acode,string(10));
_define_var(ocode,string(10));
_define_var(total,integer);
_define_var(rtcode,integer);
_color(2);
_clear(total);
_openwindow(1,6,10,8,55,1,3);
_locate(7,10);
_sprint("List systems in which area code ? ");
_masked_input(1,acode,"(999)");
_LoadRecord(rtcode,acode);
_openwindow(2,9,19,15,60,1,13);
_while(rtcode);
_++(total);
_call(display);
_GetNextRecord(rtcode);
_if(rtcode);
_copyfrom(ocode,1);
_if(ocode != acode);
_clear(rtcode);
_endif;
Osiris SE Technical Reference Manual Page 418
_endif;
_wend;
_color(7);
_elseif(total > 0);
_locate(12,31);
_printf("Found %3d systems.",total);
_else;
_locate(12,25);
_printf("I'm sorry, no systems listed!");
_eend;
_locate(15,24);
_printf("Press any key to continue . . .");
_getc(ch,0);
_closewindow(2);
_closewindow(1);
_pend;
_procedure(display);
_define_var(s1,string(81));
_define_var(a1,integer);
_define_var(b1,integer);
_define_var(c1,integer);
_define_var(mask,string(81));
_color(3);
_locate(10,21);
_sprint("BBS : ");
_color(15);
_copyfrom(s1,6);
_printf("%s",s1);
_locate(11,21);
_color(3);
_sprint("PHONE : ");
_color(15);
_copyfrom(a1,1);
_copyfrom(b1,2);
_copyfrom(c1,3);
_sprintf(s1,"%d%d%d",a1,b1,c1);
_make_mask(mask,s1,"(999) 999-9999");
_printf("%s",mask);
_locate(12,21);
_color(3);
_sprint("CITY : ");
_color(15);
_copyfrom(s1,5);
_printf("%s",s1);
_locate(13,21);
_color(3);
Osiris SE Technical Reference Manual Page 419
_sprint("STATE : ");
_color(15);
_copyfrom(s1,4);
_printf("%s",s1);
_locate(15,27);
_printf("Press any key to continue ");
_getc(ch,0);
_clearwindow(2);
_pend;
_procedure(findstate);
_define_var(state,string(10));
_define_var(ostate,string(10));
_define_var(total,integer);
_define_var(rtcode,integer);
_color(2);
_clear(total);
_openwindow(1,6,10,8,55,1,3);
_locate(7,10);
_sprint("List systems in which State ? ");
_masked_input(1,state,"AA.");
_SetToFirstRecord();
_assign(rtcode,1);
_openwindow(2,9,19,15,60,1,13);
_while(rtcode);
_copyfrom(ostate,4);
_if(ostate = state);
_++(total);
_call(display);
_endif;
_GetNextRecord(rtcode);
_wend;
_color(7);
_elseif(total > 0);
_locate(12,31);
_printf("Found %3d systems.",total);
_else;
_locate(12,25);
_printf("I'm sorry, no systems listed!");
_eend;
_locate(15,24);
_printf("Press any key to continue . . .");
_getc(ch,0);
_closewindow(2);
_closewindow(1);
_pend;
Osiris SE Technical Reference Manual Page 420
_procedure(findcity);
_define_var(city,string(20));
_define_var(ocity,string(20));
_define_var(total,integer);
_define_var(rtcode,integer);
_color(2);
_clear(total);
_openwindow(1,6,10,8,55,1,3);
_locate(7,10);
_sprint("What City ? ");
_masked_input(0,city,"XXXXXXXXXXXXXXXXXXXXX");
_SetToFirstRecord();
_assign(rtcode,1);
_openwindow(2,9,19,15,60,1,13);
_while(rtcode);
_copyfrom(ocity,5);
_if(ocity = city);
_++(total);
_call(display);
_endif;
_GetNextRecord(rtcode);
_wend;
_color(7);
_elseif(total > 0);
_locate(12,31);
_printf("Found %3d systems.",total);
_else;
_locate(12,25);
_printf("I'm sorry, no systems listed!");
_eend;
_locate(15,24);
_printf("Press any key to continue . . .");
_getc(ch,0);
_closewindow(2);
_closewindow(1);
_pend;
Osiris SE Technical Reference Manual Page 421
Itc, Itc2, And Itlink
Itc.exe
ITC.EXE is the main SPL/I compiler. It takes your source
code and turns it into OBJECT code. ITC expects ALL
SOURCE code files to have the file extension .SCR
ITC requires one command line argument, the name of the
source file MINUS the file extension, ITC will add that.
Example
ITC TEST
This will compile the SPL/I source, TEST.SRC, into
TEST.OBJ. This is not a RUNABLE SPL/I program file, it
still has to be linked with ITlink.
ITC can also accept an optional command line switch, /P
or -P.
This tells the compiler that this source file is NOT a
full functional program.
This allows you to break your SPL/I program into smaller
modules and have the linker combine them for you.
The benefit is: You can break a LARGE program into
smaller individual modules. If you have to fix a problem
in one of them, you only have to recompile that module
instead of the whole thing.
Itlink.exe
ITlink takes your object file and turns it into an
executable PRG file.
Assuming the OBJECT file was TEST.OBJ
ITLINK TEST
Notice I did not use the .OBJ extension, ITlink adds
that.
The final output file: TEST.PRG
Osiris SE Technical Reference Manual Page 422
Linking Multiple Object Modules
If you break the program into multiple files, you
will have to create a LINK control file. Use the
same first name, up to the extension that you used
for the MAIN module ( the one with MEND in it), and
the extension of .LNK
Example
Test.obj <= Main Program module
Pro1.OBJ <= Contains a Procedure module
PRO2.OBJ <= Contains a Procedure module
To compile:
--------------------
V |
ITC test /P |
ITC pro1 /P |
ITC pro2 /P |
|
Then Create a TEST.LNK ----
containing:
TEST
PRO1
PRO2
The first file you list MUST be MAIN, the one with
_MEND in it. Then list the other object files, in
any order.
Now call ITlink to produce the finished product:
ITLINK TEST /P
Test is the name of the MAIN object file, and also
the name of the LNK file. The /P tells the linker
that it needs to use the LNK file to combine the
individual object files to produce the executable
PRG file.
The file ITLINK will produce is TEST.PRG, the
executable SPL/I program.
Osiris SE Technical Reference Manual Page 423
Say you found a bug in PRO1 and you have fixed it.
To generate a NEW TEST.PRG:
ITC PRO1 /P
ITLINK TEST /P
You did not have to recompile the other two
modules.
ITC2.EXE is a compiler SUBMODULE. Given the amount
of memory a compiler can consume, it had to be
split into two programs. You do NOT call ITC2,
that's handled by the other programs.
Compiler/Linker Limits
You may not have more than 2000 _define_var() statements
in any program (even if you break it into modules). The
compiler has to TRACK every single variable name and the
implicit address assigned to it, to make sure no two
ACTIVE variables get the same address. Tracking that
much information does require a lot of memory. I hope,
in version 2, to increase that to 16000.
You may not have more than 1500 procedures in any given
program. The reasons are pretty much the same. The
compiler has to track each procedure name and it's
implicit address so no two procedures get assign the
same address.
Neither limit should pose any problem given that
Osiris.exe doesn't even exceed those limits and I don't
think you'll be writing anything as major as OSIRIS.EXE
in SPL/I.
Run.exe
Run.exe is an external TEST program that can execute
PRG's outside of Osiris. Run supports 99 percent of the
SPL/I commands in one form or another. Some commands,
mostly internal Osiris commands, are supported but do
nothing but flash a message on the screen.
Run.exe requires one command line argument, the name of
the prg it is suppose to run.
E.g., RUN TEST.PRG
The first version of RUN does NOT trap for non-existing
programs and just assumes that the program will exist.
If you feed it a program name that does not exist, it
may lock-up.
Osiris SE Technical Reference Manual Page 424
Memo Databases
A memo database is a collection of variable length records
used to store large volumes of text in a single file.
Unlike your traditional DATABASES, a memo database has no KEY
field, it simply has a record number.
Uses
There are a number of possible uses for a memo database.
Storing individual articles from a newletter or some
other ASCII publication and allowing your callers to
pull individual articles out of the database and view
them on-line.
If an SPL/I application has a LOT of text displays, you
could store the text in a memo database and pull it out
for display when you need it. This would make the SPL/I
application smaller and easier to manage.
How
There is only one method of locating a memo record, by
its record number. You can access it using an explicit
record number like 1, 2, 0, 27.
E.g., _IF(ch = 'B')
display memo record 245
_ENDIF;
You can store the record number in an indexed SPL/I
database field and use the btree index system to locate
the correct database record and use the 2nd database
field to hold the memo database record number.
That sounds complex, but it really isn't. All you have
to do is create an SPL/I database with two fields. The
first field would be the index field, something used to
locate the record . . . like article name. The second
field would be used to store the memo record number that
contains that article.
Making A Memo Database
Making a memo database is fairly easy and only requires
two steps.
First, use a text file to hold all the records. Start
each record with ASCII 1 and end each record with
ASCII1. The first line should be a header field to
identify what the record contains, this is for YOUR use.
Osiris SE Technical Reference Manual Page 425
E.g.,
^AExplanation of a memo field
A memo database is a collection of variable length
records used to store large columns of text in a single
file.
Unlike your traditional DATABASES, a memo database has
no KEY field, it simply has a record number.
^A
That would be a complete memo record. Notice how it is
enclosed with ASCII 1's AND the first line is the
header. The header is NOT kept in the database itself,
only the text
"A memo database is a collection of variable length
records used to store large volumes of text in a single
file.
Unlike your traditional DATABASES, a memo database has
no KEY field, it simply has a record number.
"
will be retained.
It is very important that you never forget that the
first line is suppose to be a header. Failing to use the
first line as a header line will cause the text to be
out of sync for that record.
There is no practical limit on the number of memo field
records you can store in one file.
After you have constructed the text file containing your
records, run the program MEMO.EXE. Memo.exe takes the
text file and converts it into database format.
Memo requires one command line argument, the name of the
text file. Lets assume that we used the name
"INFOMALL.TXT".
Osiris SE Technical Reference Manual Page 426
Memo Infomall.txt
Memo will create THREE files; INFOMALL.DAT,
INFOMALL.IDX, and INFOMALL.LOG.
INFOMALL.DAT and INFOMALL.IDX contains the actual
memo records and the index to the infomall.dat
file. When you use the
_display_memo_record(Datafile,indexfile,Record#)
call you would use these two names in place of
datafile and indexfile.
E.g.,
_display_memo_record("infomall.dat","infomall.idx",245);
The 3rd file, INFOMALL.LOG, contains the individual
record HEADERS along with the memo record number.
E.g.
^AExplanation of a memo field
A memo database is a collection of variable length
records used to store large volumes of text in a
single file.
Unlike your traditional DATABASES, a memo database
has no KEY field, it simply has a record number.
^A
One of the lines in the INFOMALL.LOG would be
something like:
Memo Record #245 - Explanation of a memo field
This is what you use to figure out which memo
record contains what! If I want to display the memo
record containing the text for "explanation of a
memo field", I would just call for MEMO record 245.
E.g.,
_display_memo_record("infomall.dat","infomall.idx",245);
Osiris SE Technical Reference Manual Page 427
Mmu
Multiple Menu Utility
Osiris supports not only ASC (ASCII) and ANS (ANSI) files but
it also supports MMU files.
Normally you have two sets of files; ASC for non-ansi callers
and ANS for those that support ANSI. There isn't anything
wrong with this, but you do have TWO files for every menu or
display screen and that eats up disk space.
It would be a lot nicer to have only one file for BOTH types
of callers and let the BBS filter out the COLOR commands if
the caller doesn't support ANSI. Well, that's what MMU does.
Mmu.exe
MMU will take an ANSI file and convert it to MMU format
using compressed color commands and then compress the
file to speed up display. If the caller doesn't support
ANSI, Osiris will simply skip over the color commands.
MMU is fairly simply to use, just enter the name of the
file to convert. If the file is in ANSI format, add /A.
E.g., Suppose you want to convert your main menu file,
main.ans to MMU format. MAIN.ANS is in ansi format so .
MMU MAIN.ANS /A
creates the file "MAIN.MMU".
You can now delete MAIN.ANS and MAIN.ASC and Osiris will
use MAIN.MMU for everyone.
Suppose you have a display file, it does NOT contain
ANSI characters, but you want to convert it to MMU
format to save disk space and to speed up the display.
Lets call the file "HELPFILE.ASC".
MMU HELPFILE.ASC
Since there are no ANSI commands, we don't use the /A
switch and the output file will be HELPFILE.ASC.
There is an optional switch, /F, that you MAY want to
use. /F controls data compression. Normally, data
compression is turned OFF. But, if the file contains NO
BACKGROUND COLOR CHANGES, you would get a faster
displaying file if you use /F.
Osiris SE Technical Reference Manual Page 428
E.g.,
MMU MAIN.ANS /A /F
Produces a smaller MAIN.MMU and it is even faster than
the first main.mmu we created.
Command Line Switches
For more advanced users, there are several optional
switches.
/A Do conversion on <Infile>, when <Infile> is
in ANSIformat
/B Place [breakoff] at top of file. Only if '/A'
is specified
/C Place [Cls] at top of file. Only if '/A' is
specified
/N Do Color implants. Only if '/A' is specified
/M Place [Moreoff] at top of file. Only if '/A'
is specified
/F Data Optimizing ON (default is OFF)
/25 Allow FULL 25 Line(s) (/A Only)
/O Do conversions from ANSI to MMU pre-compiler
format ONLY. Only if '/A' is specified
/B Place breakoff at the top of the file.
Turning break off means the caller cannot break
out of the file. He has to wait until the entire
file has been displayed.
/C Place clear screen at the top of the file.
/N Do color implants. I've never ran across an
ANSI file that required this, but if you compile an
ANSI file and you flat can't get the colors to come
out right, add this switch.
/M Place MOREOFF at the top of the file. This
disables the PAUSE/MORE prompt while this file is
being displayed. It is generally used for OPENING
welcome screens.
Osiris SE Technical Reference Manual Page 429
/25 Do all 25 lines. MMU will optimize ANSI files
created by THEDRAW and other programs that save a
full 25 lines, even if you don't use them, by
removing the trailing lines. If, for some reason,
you want all 25 lines, add this switch.
/O Do conversion from ANSI to pre-compiler code
format and then stop. This is generally used to
convert ANSI files into a format that you can edit.
Precompile Format
The pre-compiler format would consist of special KEY
words encased in [].
E.g., [YELLOW], [LTGREEN], etc.
Keep in mind that the key words WOULD be enclosed in
square brackets.
You can, if you want, build a pre-compiled MMU file by
hand and then compile it into a finished MMU file. Just
leave OFF the /A.
E.g., suppose you created WELCOME3.TXT containing pre-
compiler commands.
MMU WELCOME3.TXT /F
Creates a compressed WELCOME3.MMU file.
The next few pages will give you a break down of the
pre-compiler MMU commands and what they do.
Mmu Commands
Osiris SE Technical Reference Manual Page 430
Summary
[Black]
Description
Changes the FOREGROUND color to Black. Background color
is not changed.
Example
[BLACK]Hello world!
Causes HELLO WORLD! to be printed in Black.
NOTE: If Background is also Black, the message would be
invisible.
Osiris SE Technical Reference Manual Page 431
Summary
[Red]
Description
Changes the FOREGROUND color to Red, Background color is
not changed.
Example
[Red]Hello world!
Causes HELLO WORLD! to be printed in Red.
Osiris SE Technical Reference Manual Page 432
Summary
[Green]
Description
Changes the FOREGROUND color to Green, Background color
is not changed.
Example
[GREEN]Hello world!
Causes HELLO WORLD! to be printed in Green.
Osiris SE Technical Reference Manual Page 433
Summary
[Blue]
Description
Changes the FOREGROUND color to Blue, Background color is
not changed.
Example
[BLUE]Hello world!
Causes HELLO WORLD! to be printed in Blue.
Osiris SE Technical Reference Manual Page 434
Summary
[Yellow]
Description
Changes the FOREGROUND color to Yellow, Background color
is not changed.
Example
[Yellow]Hello world!
Causes HELLO WORLD! to be printed in yellow.
Osiris SE Technical Reference Manual Page 435
Summary
[Magenta]
Description
Changes the FOREGROUND color to magenta, Background color
is not changed.
Example
[MAGENTA]Hello world!
Causes HELLO WORLD! to be printed in Magenta.
Osiris SE Technical Reference Manual Page 436
Summary
[Cyan]
Description
Changes the FOREGROUND color to cyan, Background color is
not changed.
Example
[CYAN]Hello world!
Causes HELLO WORLD! to be printed in cyan.
Osiris SE Technical Reference Manual Page 437
Summary
[White]
Description
Changes the FOREGROUND color to BRIGHT white, Background
color is not changed.
Example
[WHITE]Hello world!
Causes HELLO WORLD! to be printed in white.
Osiris SE Technical Reference Manual Page 438
Summary
[Brown]
Description
Changes the FOREGROUND color to Brown, Background color is
not changed.
Example
[BROWN]Hello world!
Causes HELLO WORLD! to be printed in brown.
Osiris SE Technical Reference Manual Page 439
Summary
[Gray]
Description
Changes the FOREGROUND color to gray, Background color is
not changed.
Example
[GRAY]Hello world!
Causes HELLO WORLD! to be printed in gray.
Osiris SE Technical Reference Manual Page 440
Summary
[Ltred]
Description
Changes the FOREGROUND color to light red, Background color
is not changed.
Example
[LTRED]Hello world!
Causes HELLO WORLD! to be printed in light red.
Osiris SE Technical Reference Manual Page 441
Summary
[Ltgreen]
Description
Changes the FOREGROUND color to light green, Background
color is not changed.
Example
[LTGREEN]Hello world!
Causes HELLO WORLD! to be printed in light green.
Osiris SE Technical Reference Manual Page 442
Summary
[Ltblue]
Description
Changes the FOREGROUND color to light blue, Background color
is not changed.
Example
[LTBLUE]Hello world!
Causes HELLO WORLD! to be printed in light blue.
Osiris SE Technical Reference Manual Page 443
Summary
[Ltmagenta]
Description
Changes the FOREGROUND color to light magenta, Background
color is not changed.
Example
[LTMAGENTA]Hello world!
Causes HELLO WORLD! to be printed in light magenta.
Osiris SE Technical Reference Manual Page 444
Summary
[Ltcyan]
Description
Changes the FOREGROUND color to light cyan, Background color
is not changed.
Example
[LTCYAN]Hello world!
Causes HELLO WORLD! to be printed in light cyan.
Osiris SE Technical Reference Manual Page 445
Summary
[Blink]
Description
Causes the FOREGROUND color to BLINK.
Example
[BLINK][YELLOW]Hello world!
Causes HELLO WORLD! to be printed in Blinking YELLOW.
Osiris SE Technical Reference Manual Page 446
Summary
[Normal]
Description
Cause the FOREGROUND and BACKGROUND colors to revert to the
default IBM screen colors, cyan on black.
This call MUST be used to cancel the Blinking color
attribute.
Example
[NORMAL]Hello world!
Causes HELLO WORLD! to be printed in cyan on black.
Osiris SE Technical Reference Manual Page 447
Summary
[Bgblack]
Description
Changes the BACKGROUND color to BLACK.
ForeGround color and BLINK attribute, if desired, MUST be
Reset following a background color change.
Example
[BGBLACK][YELLOW]Hello world!
Causes HELLO WORLD! to be printed in YELLOW on BLACK.
Osiris SE Technical Reference Manual Page 448
Summary
[Bgred]
Description
Changes the BACKGROUND color to RED.
ForeGround color and BLINK attribute, if desired, MUST be
Reset following a background color change.
Example
[BGRED][YELLOW]Hello world!
Causes HELLO WORLD! to be printed in YELLOW on RED.
Osiris SE Technical Reference Manual Page 449
Summary
[Bggreen]
Description
Changes the BACKGROUND color to GREEN.
ForeGround color and BLINK attribute, if desired, MUST be
Reset following a background color change.
Example
[BGGREEN][YELLOW]Hello world!
Causes HELLO WORLD! to be printed in YELLOW on GREEN.
Osiris SE Technical Reference Manual Page 450
Summary
[Bgblue]
Description
Changes the BACKGROUND color to BLUE.
ForeGround color and BLINK attribute, if desired, MUST be
Reset following a background color change.
Example
[BGBLUE][YELLOW]Hello world!
Causes HELLO WORLD! to be printed in YELLOW on BLUE.
Osiris SE Technical Reference Manual Page 451
Summary
[Bgmagenta]
Description
Changes the BACKGROUND color to MAGENTA.
ForeGround color and BLINK attribute, if desired, MUST be
Reset following a background color change.
Example
[BGMAGENTA][YELLOW]Hello world!
Causes HELLO WORLD! to be printed in YELLOW on MAGENTA.
Osiris SE Technical Reference Manual Page 452
Summary
[Bgcyan]
Description
Changes the BACKGROUND color to CYAN.
ForeGround color and BLINK attribute, if desired, MUST be
Reset following a background color change.
Example
[BGCYAN][YELLOW]Hello world!
Causes HELLO WORLD! to be printed in YELLOW on CYAN.
Osiris SE Technical Reference Manual Page 453
Summary
[Bgwhite]
Description
Changes the BACKGROUND color to WHITE.
ForeGround color and BLINK attribute, if desired, MUST be
Reset following a background color change.
Example
[BGWHITE][BLUE]Hello world!
Causes HELLO WORLD! to be printed in BLUE on WHITE.
Osiris SE Technical Reference Manual Page 454
Summary
[Enter]
Description
Causes the display to STOP until the caller presses RETURN.
This is generally used To stop display files
from scrolling off the screen
Example
It is time for all good men to step forward and be counted.
Press RETURN to Continue [enter]
Osiris SE Technical Reference Manual Page 455
Summary
[Breakoff]
Description
You have the option of BREAKING out of a menu display, etc.
by pressing ctrl-K.
If BREAKOFF is used, I'll ignore the Ctrl-K request.
Osiris SE Technical Reference Manual Page 456
Summary
[Breakon]
Description
This reenables Ctrl-K if it was shut off with BREAKOFF.
Osiris SE Technical Reference Manual Page 457
Summary
[Moreoff]
Description
Every time a complete line of text is displayed, one ending
with a carriage return, a LINE counter is increased by 1.
When the counter is greater than the number of lines the
remote terminal can handle, without scrolling the top line
off the screen, the -PAUSE- prompt is displayed.
[MOREOFF] disables the -PAUSE- prompts until you turn it back
on OR you exit the current file.
Osiris SE Technical Reference Manual Page 458
Summary
[Moreon]
Description
This reenables the line counter if it was shut off with
[MOREOFF].
Osiris SE Technical Reference Manual Page 459
Summary
[Cls]
Description
Clears the current display screen and positions the cursor at
0,0 on the screen.
Osiris SE Technical Reference Manual Page 460
Summary
[Run_program Prg_name]
Description
This lets you call SPL/I command files from within other text
files. Replace PRG_NAME with the complete drive, path, and
name of the command file you want to execute.
Example
[RUN_PROGRAM C:\OSIRIS\PRG\QSRV.PRG]
Osiris SE Technical Reference Manual Page 461
Osiris Language Database
Osiris uses a language database to store the text and colors
used within the main Osiris.exe program. This means you can
alter any text display, change it to a different language,
and the colors Osiris uses.
The two areas that do not use the language database;
statistics system and Osage. Neither use it because both are
POSITION/LENGTH sensitive, graphs and windows, and modifying
the text would throw the displays out of whack.
The default language database is called "CMDS.DAT" and the
uncompiled TEXT version is in a file called "CMDS.TXT".
Each line of text in CMDS.TXT is a SINGLE database record.
Osiris does, in a number of places, combine multiple database
records to form a complete sentence or display, especially
when the sentence contains variables.
The text's POSITION in the cmds.txt file is very important
and if you modify the text, or colors, you must NOT modify
the texts position in this file. If you do, you'll throw the
entire display system off.
Each record, or line, has a maximum length of 254 characters,
including color, formatting characters, etc.
We've provided a pure TEXT version, ASCII.TXT, which is a
clone of CMDS.TXT minus ANSI colors, easier to read.
There is no EASY method of identifying exactly where
each record is used. Actually there is, but it requires the
Osiris source code but you don't have that and we're not
going to give it to you. So the best way to tell is just
to look, while in local mode, at the text being displayed
and try to match it with text in the control file.
In a lot of cases, it will be fairly obvious where the text
is displayed and what it is used for. In other cases, you may
have to use the old trial and error method. I am assuming
that you aren't going to be tampering with this file until
you are fairly familiar with the Software.
And if all else fails, you can always ask the sysop of
Vetlink 3, he can tell you exactly what lines are used for a
particular display.
Osiris SE Technical Reference Manual Page 462
CMDS.TXT not only contains the text and colors, it also
contains a LOT of the formatting commands. Either in the
form of \r, \n, _, or spaces.
\r generates a carriage return. This does NOT generate a NEW
line, it simply puts you on COLUMN 0, same line.
\n generates a NEW LINE, i.e., it moves you down a line.
_ is a BLANK SPACE indicator, most text editors do not allow
you to end a line with a space, and they shouldn't. When you
are required to RESERVE a blank and the blank is at the end
of a line, use the underscore character.
If you want to translate the text to another language, first
do a DIRECT, if possible, translation line for line without
regards to the combined use of multiple records.
Do this a section at a time. By section, I mean a SET number
of lines . . . 20 is a good number. Log-on locally and try
out the areas that use the text. You many need to adjust the
text alignment if the language conversion makes the text
longer or shorter.
Cmdmake.exe
CMDMAKE.EXE is the language database compiler. It takes
the raw text file, CMDS.TXT, and compiles it to
CMDS.DAT.
Ascii.txt
This contains the text and formatting characters minus
the ANSI color commands.
Cmds.key
CMDS.KEY contains the command keys associated with
certain hardcoded items, like the y/N prompt, more
prompt, more prompt in the a file listing, etc.
If you change the language, then you would also want to
change the command keys to go along with the language.
In other words, YES in German is not spelled YES and
using Y to indicate Yes in German would not make sense.
Lankey.exe
Lankey.exe can be used to redefine the keys used in
the CMDS.KEY file. Just run the program and it will
tell you what to do.
Osiris SE Technical Reference Manual Page 463
Designing Your Own Bbs
Even though this section deals with SPL/I, I decided to place
it near the end of the documentation because it deals with an
advanced concept and you do not have any business attempting
to use it until you have quite a bit of Osiris SPL/I
experience.
SPL/I is very powerful, so powerful you can create your own
unique BBS and I'm going to do one for you, to give you an
idea how the logic should flow. The BBS we'll create will be
a COPY of what you might normally find on an Osiris BBS. I'm
not going to do a lot of fancy subsystems, windows, or
multiple BBS' in one. I just want to show you the logic
behind the setup so you can let your own imagination run
wild.
I'm not going to explain how each command works or that
commands syntax. You should know that by now and if you
don't, you aren't ready for this section.
Autoexec.prg
Osiris has a special command file, autoexec.prg,
specifically for this purpose. If this file exists, in
your OSIRIS= directory, it will be executed as soon as
the caller enters his or her password.
Getting Started
If you'll log-on to your own system, you'll notice that
everyone gets the same basic displays before reaching
the main menu; New personal mail check, new conference
mail check (if active), new bulletin check, and finally
the new uploads search, if active.
Because the new upload search always asks IF you want to
do one, I'm going to have to do the same thing. If I
ask, I need a variable to hold the answer so the first
item is:
_define_var(ch,character);
To keep the screen nice and neat, I'm going to clear it
_cls();
The next item is the new private mail search so,
_private_mail_scan();
Osiris SE Technical Reference Manual Page 464
The next step is the new conference mail check. But,
unlike the new private mail search, this one is optional
so I'm going to have to check to see IF the caller has
turned that option on. There is a predefined variable,
_NCONF that contains 1 if the caller has selected this
option and 0 if he did not.
There are a number of ways to check it, but the simplest
is the _IF statement.
_if(_NCONF = 1);
_run_newmail_scan();
_Endif;
Another way to check _NCONF
_IF(_NCONF);
_run_newmail_scan();
_Endif;
If no operator is present, the expression is evaluated
TRUE or FALSE. Since a non-zero number always evaluates
TRUE, this will work.
Ok, lets stop and put all this together.
_define_var(ch,character);
_cls();
_private_mail_scan();
_IF(_NCONF);
_run_newmail_scan();
_Endif;
The new bulletin search is next so
_new_bulletin_scan();
The next step is "LAST CALLER" to the system and a
number of other STATISTICAL displays.
Like everything else in SPL/I, there is no limit to what
you COULD do, but we'll limit it to just the last
callers name, city, number of system users, node he or
she is on, the connect rate, total calls that node has
received TO DATE, and the amount of time left for the
day.
I said I wasn't going to do anything fancy, like
windowing, but I think I will . . . just to help gear up
your imagination.
Osiris SE Technical Reference Manual Page 465
I'll use five different windows to display the
information and I'll open them in staggered order, i.e.,
not one right after the other. I'll jump around on the
screen to give it an animated look.
Because of the ansi display is going to be a tad on the
fancy side, we'll make this section a procedure and
call it. To keep things as simple as possible, we'll use
two procedures, ANSI_HELLO and PLAIN_HELLO.
We'll use an _ELSEIF statement to test the predefined
variable _ANSI to determine which procedure to call.
_elseif(_ANSI);
_CALL(ANSI_HELLO);
_else;
_CALL(PLAIN_HELLO);
_eend;
_procedure(ANSI_HELLO);
Keep in mind that when you use windows, it is up to you
to keep track of the cursor. You'll have to save the
original location, move it to the new location (when you
want to print something), and restore it after you close
the windows.
I've always like the variable names ROW and COL to store
cursor information so
_define_var(row,integer);
_define_var(col,integer);
Since we're going to pause at the end of the display and
wait for the caller to press a key,
_define_var(ch,character);
The next step is to save the current cursor position and
open the window.
_curget(row,col);
_openwindow(1,7,24,7,66,2,15);
Osiris SE Technical Reference Manual Page 466
Now we'll position the cursor in the window and print
where the caller was from.
_locate(8,38);
_color(15);
_putc(' ');
_color(2);
_sprint(" From ");
_color(15);
_putc(' ');
_color(14);
_locate(7,25);
_printf("%s",_LCCITY);
Notice I used the SPL/I color command instead of the
embedded ANSI color commands.
Actual, the embedded ANSI commands would be a little
faster, but for some reason I just felt like using the
color command.
Our next window will display the callers name.
_openwindow(2,4,18,4,60,2,15);
_locate(3,32);
_color(15);
_putc(' ');
_color(2);
_sprint(" Last Caller ");
_color(15);
_putc(' ');
_color(14);
_locate(4,19);
_printf("%s",_LCNAME);
If you'll look at the last two window examples, you'll
notice both have some rather out of place locate and
putc calls.
I decided to get a little fancy and add window headers
to the windows by overwriting the border with headers
explaining what the windows represented. Its an example
of how you can add versatility to an existing SPL/I
command with a little imagination.
Osiris SE Technical Reference Manual Page 467
_openwindow(3,11,41,13,75,2,13);
_color(14);
_locate(11,56);
_sprint(": ");
_color(3);
_sprint("No. of Users");
_color(14);
_locate(12,56);
_sprint(": ");
_color(3);
_sprint("Total Calls");
_locate(13,61);
_sprint("To Date");
_color(15);
_locate(11,48);
_printf("%7l",_TUSERS);
_locate(12,48);
_printf("%7l",_TOTALCALLS);
_openwindow(4,11,2,13,36,2,13);
_locate(11,3);
_color(3);
_sprint("Current Node ");
_color(14);
_putc(':');
_color(15);
_printf(" %-7d",_NODE);
_locate(12,3);
_color(3);
_sprint("Connect Baud Rate ");
_color(14);
_putc(':');
_color(15);
_printf(" %d",_BRATE);
_color(3);
_locate(13,3);
_sprint("Time Left Today ");
_color(14);
_putc(':');
_color(15);
_printf(" %d",_TIMELEFT);
Both of these windows reverse JUSTIFY the text. In
other words, instead of printing from the first column
in the window, they reverse the way the text is print
and start with the inner column and print out to the
first column.
Osiris SE Technical Reference Manual Page 468
You'll just have to type in this section and run it to
really appreciate it.
The last window is the press any key to continue window
and it goes something like this
_openwindow(5,17,24,17,56,0,12);
_locate(17,25);
_sprint("Press any key to continue . . .");
_getc(ch,0);
The of the last thing we do in the procedure is, close
the windows.
Normally you'd want to close the windows in reverse
order, i.e., last opened is first closed. But since none
of our windows overlap, you get some free, no work
involved, special effects by staggering the closing
order.
_closewindow(3);
_closewindow(2);
_closewindow(1);
_closewindow(4);
_closewindow(5);
And finally, put the cursor back in its original
position and end the procedure.
_locate(row,col);
_pend;
Lets put the entire procedure together so you can block
copy it to disk and try it out.
_procedure(ANSI_HELLO);
_define_var(row,integer);
_define_var(col,integer);
_define_var(ch,character);
_curget(row,col);
_openwindow(1,7,24,7,66,2,15);
_locate(8,38);
_color(15);
_putc(' ');
_color(2);
_sprint(" From ");
_color(15);
Osiris SE Technical Reference Manual Page 469
_putc(' ');
_color(14);
_locate(7,25);
_printf("%s",_LCCITY);
_openwindow(2,4,18,4,60,2,15);
_locate(3,32);
_color(15);
_putc(' ');
_color(2);
_sprint(" Last Caller ");
_color(15);
_putc(' ');
_color(14);
_locate(4,19);
_printf("%s",_LCNAME);
_openwindow(3,11,41,13,75,2,13);
_color(14);
_locate(11,56);
_sprint(": ");
_color(3);
_sprint("No. of Users");
_color(14);
_locate(12,56);
_sprint(": ");
_color(3);
_sprint("Total Calls");
_locate(13,61);
_sprint("To Date");
_color(15);
_locate(11,48);
_printf("%7l",_TUSERS);
_locate(12,48);
_printf("%7l",_TOTALCALLS);
_openwindow(4,11,2,13,36,2,13);
_locate(11,3);
_color(3);
_sprint("Current Node ");
_color(14);
_putc(':');
_color(15);
_printf(" %-7d",_NODE);
_locate(12,3);
_color(3);
_sprint("Connect Baud Rate ");
_color(14);
_putc(':');
_color(15);
_printf(" %d",_BRATE);
_color(3);
_locate(13,3);
Osiris SE Technical Reference Manual Page 470
_sprint("Time Left Today ");
_color(14);
_putc(':');
_color(15);
_printf(" %d",_TIMELEFT);
_openwindow(5,17,24,17,56,0,12);
_locate(17,25);
_sprint("Press any key to continue . . .");
_getc(ch,0);
_closewindow(3);
_closewindow(2);
_closewindow(1);
_closewindow(4);
_closewindow(5);
_locate(row,col);
_pend;
The procedure PLAIN_ANSI is your run of the mill, plain
jane procedure and doesn't really have anything special
that would need any type of detailed explanation so
I'll just list it.
_procedure(PLAIN_ANSI);
_define_var(ch,character);
_cls();
_printf("Last Caller %s From %s\n",_LCNAME, LCCITY);
_printf("You are caller #%l on Node %l\n\n"_TOTALCALLS,_TUSERS);
_printf("Connect Rate : %d\n",_BRATE);
_printf("Time Left Today : %d Min(s)\n\n",_TIMELEFT);
_printf("Press any key to continu . . .");
_getc(ch,1);
_cls();
_pend;
You COULD get a little fancier than that but this
type of procedure just doesn't excite me.
Osiris SE Technical Reference Manual Page 471
Now, the NEW UPLOADS search is also a user configuration
option so I'm going to have to test to see if it is
turned on. There is a predefined variable called
_NEWUPLOADS that contains 1 if the caller has the option
turned on and 0 if it is off.
_IF(_NEWUPLOADS);
_Endif;
The body of the _IF statement will need to ASK if the
caller wants to do the search. Now, we have to keep in
mind that not everyone supports or wants ANSI colors so
we can't just use one prompt for everyone.
Like the newuploads search option, there is a predefined
variable, _ANSI, that we can check.
Since we're going to print one of two prompts, depending
on the value of _ANSI, the ELSEIF statement would be the
logical method.
_ELSEIF(_ANSI);
_ELSE;
_EEND:
We now have
_IF(_NEWUPLOADS);
_ELSEIF(_ANSI);
_ELSE;
_EEND;
_Endif;
Since ANSI characters are hard to get into a word
processor, I'm not going to display them so use your
imagination.
Osiris SE Technical Reference Manual Page 472
There are several ways of printing the text, but we'll
use the printf statement. It isn't the fastest method,
but the amount of text is so small, it wouldn't make any
noticeable difference no matter what method we used.
My personal preference is the MEMO database. I could use
only one prompt, the MEMO database record display
function will filter the none-ansi characters if the
caller does not support ansi. That would make my
autoexec.prg much smaller and easier to read.
_if(_NEWUPLOADS);
_elseif(_ANSI);
_printf("SEARCH FOR NEW UPLOADS [y/N] ? ");
_else;
_printf("Search For NEW Uploads [y/N] ? ");
_eend;
_endif;
We're only interested in a single character answer, Y or
N so the _getc command would be the method we'll use to
get the input. Again, it isn't the only way but it is
simple and gets the job done.
Since we want to keep our testing to a minimum, we'll
force what the caller types in to upper case using the
command
_getc(ch,1);
If you get a lot of callers that have line that aren't
exactly the cleanest in the world, you might want to use
_get_ctrl_input(ch,"YN"); because of its ability to
filter out the garbage characters.
If you do use _get_ctrl_input, you'll need to change the
"y/N" to "Y/N", entering nothing would not be allowed.
You could also use get_masked_input or even _gets() and
use the copy_ch function to extract the single
character.
Despite the answer, Y or N, we want to clear the screen
to keep it nice and neat looking.
_cls();
Osiris SE Technical Reference Manual Page 473
You might think that because we have two possible
answer, that we need to test two expression or use
ELSEIF. Normally that might be the case and you
certainly could do it that way if you wanted to.
But since we indicated that the default was 'N', we only
need to test to see if the other answer was given, the
'Y'.
If it was, we need to run the new uploads search.
_if(ch = 'Y');
_run_newuploads_scan();
_call(press_return);
_endif;
Since the new uploads scan does NOT pause after
displaying its last message, we have to add a press
return to continue prompt.
Since this would be the kind of prompt we may use in
other places, I've placed it in a procedure and I'll
call it when I need it. I'll outline the procedure later
on, but for now just take my word for it.
That completes the log-in process down to the main menu.
The next step might well be displaying the main menu and
looping until the caller hangs up, but I want to leave
myself some "EXPANSION" room so I'm going to place the
main menu in its own procedure and just call it. This
also gives my SPL/I command file a cleaner look. I'll
call the main menu procedure "main_menu". That
indicates, by looking, what the procedure does.
_call(main_menu);
_mend;
Osiris SE Technical Reference Manual Page 474
Before we get into the main procedure lets put
everything together so you can review what we've done so
far.
_define_var(ch,character);
_cls();
_private_mail_scan();
_if(_NCONF);
_run_newmail_scan();
_Endif;
_new_bulletin_scan();
_elseif(_ANSI);
_CALL(ANSI_HELLO);
_else;
_CALL(PLAIN_HELLO);
_eend;
_if(_NEWUPLOADS);
_elseif(_ANSI);
_printf("Search For NEW Uploads [y/N] ? ");
_else;
_printf("Search For NEW Uploads [y/N] ? ");
_eend;
_getc(ch,1);
_cls();
_if(ch = 'Y');
_run_newuploads_scan();
_call(press_return);
_endif;
_endif;
_call(main_menu);
_mend;
Osiris SE Technical Reference Manual Page 475
Main_menu
The first thing we have to do is declare the procedure
with _procedure(main_menu);
We're going to want to HOLD the caller in the MAIN menu
loop from now until he hangs up so we'll need a loop.
The _WHILE is one method and it is easy to setup and
control.
We'll also need to setup some variables for the
main_menu procedure.
I'll declare them now and explain them as I use them.
_define_var(not_done,integer);
_define_var(ch,character);
_define_var(empty_queue,integer);
I'll use the not_done variable to drive the while loop.
Now, there are two ways I could do this, by setting
not_done to 1 and looping as long as it is one or by
setting it to zero and looping as long as it is zero.
Doesn't matter either way because I don't intend to
every change it.
To keep consistent with other examples in this document,
lets assign it the value of 1.
_assign(not_done,1);
We now have:
_procedure(main_menu);
_define_var(not_done,integer);
_define_var(ch,character);
_define_var(empty_queue,integer);
_assign(not_done,1);
_while(not_done);
_wend;
_pend;
The reason we want to HOLD the caller in this loop is
because the main menu is the focal point of the system.
Everything else is accessed FROM the main menu and
everything returns TO the main menu.
Osiris SE Technical Reference Manual Page 476
You might be wondering, "If I'm in the file area and
select the Conference system option, how do I get
there if I have to return to the main menu?".
That is the sixty four dollar question and I'll answer
it in short order, but first lets setup our menu display
and input prompts.
The first thing we want to do inside the while loop is
to clear the screen, _cls();
Because Osiris allows command stacking, you wouldn't
just jump in and display the menu and input prompt. We
first have to see if there are in PENDING commands.
Again, this is NOT a requirement but it would waste a
lot of time displaying the menu when the caller has
already made his selection.
_command_queue_status(empty_queue);
Empty_queue is an integer variable and the function
"_command_queue_status" will set empty_queue to 1 if
there is NO commands pending and 0 if there are.
With the status of the command queue tucked into the
empty_queue variable, we can test using the _IF
statement. If empty_queue equals 1, go ahead and display
the menu and the input prompt.
_if(empty_queue);
_endif;
When it comes to displaying some sort of menu, there are
about as many ways of doing it as there are ways to draw
a menu.
If my personal preference is to use a memo database, it
saves diskspace and it is fast, but that is a little to
advanced for most folks.
The EASIEST method is the MMU system. That lets you
use your old main.mmu/asc/ans files without
making modifications.
You have two ways of doing this, display_text and
display_menu. Both are equal in speed but, the
display_menu lets those with HOTKEYS break out of the
display by pressing a valid key.
Osiris SE Technical Reference Manual Page 477
Lets assume the following are valid keys for this main
menu
I = Internode chat
F = File System
P = Public Messages
A = Ask the Sysop a Question
S = Statistics System
R = Read Bulletins
W = Who's On-Line
C = Change Menu
V = Version
M = Message Center
L = User List
G = Good Bye
If those are the valid command keys and MAIN.ASC/ANS/MMU
is the menu, _display_menu("IFPASRWCVDMLG","main");
The next step is the input prompt. We want to duplicate
the one Osiris uses with the time on-line and the
time left. And, since we have to consider those that
support ansi and those that don't, we need two
prompts inside an ELSEIF statement.
We now have
_procedure(main_menu);
_define_var(not_done,integer);
_define_var(ch,character);
_define_var(empty_queue,integer);
_assign(not_done,1);
_while(not_done);
_cls();
_command_queue_status(empty_queue);
_if(empty_queue);
_display_menu("IFPASRWCVDMLG","main");
_elseif(_ANSI);
_printf("Time on: %d Time remaining %d Command ? ",_CALLTIME,_TIMELEFT);
_else;
_printf("Time on: %d Time remaining %d Command ? ",_CALLTIME,_TIMELEFT);
_eend;
_endif;
_wend;
_pend;
Osiris SE Technical Reference Manual Page 478
Since we only need a single character answer, we REALLY
only need an input command that retrieves single
character responses. To further narrow it down, we want
the one that is the closest to the way Osiris normally
gets the main menu prompt so we'll use
_get_ctrled_input(ch,"WIFPASRCVYDMLGV/");
Notice that I put the _get_ctrled_input OUTSIDE of the
_if(empty_queue)
_endif
Now we have to test "ch" to see what, if anything, the
caller entered.
We can do that any number of ways, but the method that
is less likely to confuse you is the _switch statement.
It also happens to be the fastest method.
Rather than list each one separately, I'll list
the entire switch statement and then touch on the ones
that I feel need explaining.
Osiris SE Technical Reference Manual Page 479
_switch(ch);
_case('/');
_putc('/');
_call(process_slash);
_break;
_case('G');
_goto_log_off();
_break;
_case('I');
_cls();
_internode_chat();
_break;
_case('F');
_call(file_area);
_break;
_case('P');
_call(msg_area);
_break;
_case('A');
_post_msg_to_sysop();
_break;
_case('S');
_Goto_Status_system();
_break;
_case('R');
_read_bulletins();
_break;
_case('C');
_Goto_Adjust_User_settings();
_break;
_case('W');
_cls();
_show_who_is_online();
_break;
Osiris SE Technical Reference Manual Page 480
_case('D');
_global_download();
_break;
_case('M');
_goto_msg_center();
_break;
_case('L');
_cls();
_display_callers();
_break;
_case('V');
_cls();
_goto_display_version();
_break;
_default;
_printf("\n\nThat is NOT a valid command.\n");
_printf("Press any key to continue . . .");
_getc(ch,0);
_break;
_send;
You've no doubt noticed that I did not do any access
level checking. I didn't because there are several
methods of doing that type of check, depending on
personal preferences.
I also did not want to add additional weight to the
documentation by doing repetitive tasks. Rather than add
access level checking to each command, I'll show you
several methods that can apply to not only this section,
but the public messages (conference areas) and the file
systems.
Access level checking need not always be done. If
everyone has access to a command, don't waste time
checking.
If you do not use command access flags for a particular
command, most don't then I would recommend using the
_IF(_ACCESS > VALUE);
_ENDIF;
Osiris SE Technical Reference Manual Page 481
E.g.,
_case('V');
_if(_ACCESS > 5);
_cls();
_goto_display_version();
_ENDIF;
_break;
If you use command access flags, then I'd recommend
using the "_main_command_access" command. See the
section on _main_command_access for syntax. There are
also special commands to test the conference area
commands and the file area commands.
The only case label that needs explaining is
_case('/');
This is how you would process SLASH commands. When a
caller types /, to indicate a slash command, it causes
the input routine in Osiris to return with / as the
character. It does not PRINT the slash to the screen.
You don't need to know why it isn't printed, its an
internal Osiris thing but you do need to display the
slash character to let the caller know his command key
wasn't ignored
_putc('/');
Because the a slash command can be entered from any one
of our 3 primary menus, I'll make a special procedure to
process the slash commands, to reduce redundant
programming, and call that procedure when I need to
process a slash command. E.g, the
_call(process_slash);
I'll hold off explaining the "process_slash" procedure
until after we finish with the other two primary
subsystems.
Lets put the entire MAIN_MENU procedure together so you
can example it
_procedure(main_menu);
_define_var(not_done,integer);
_define_var(ch,character);
_define_var(empty_queue,integer);
Osiris SE Technical Reference Manual Page 482
_assign(not_done,1);
_while(not_done);
_cls();
_command_queue_status(empty_queue);
_if(empty_queue);
_display_menu("IFPASRWCVDMLG","main");
_elseif(_ANSI);
_printf("Time on: %d Time remaining %d Command ? ",_CALLTIME,_TIMELEFT);
_else;
_printf("Time on: %d Time remaining %d Command ? ",_CALLTIME,_TIMELEFT);
_eend;
_endif;
_get_ctrled_input(ch,"WIFPASRCVYDMLGV/");
_switch(ch);
_case('/');
_putc('/');
_call(process_slash);
_break;
_case('G');
_goto_log_off();
_break;
_case('I');
_cls();
_internode_chat();
_break;
_case('F');
_call(file_area);
_break;
_case('P');
_call(msg_area);
_break;
_case('A');
_post_msg_to_sysop();
_break;
_case('S');
_Goto_Status_system();
_break;
Osiris SE Technical Reference Manual Page 483
_case('R');
_read_bulletins();
_break;
_case('C');
_Goto_Adjust_User_settings();
_break;
_case('W');
_cls();
_show_who_is_online();
_break;
_case('D');
_global_download();
_break;
_case('M');
_goto_msg_center();
_break;
_case('L');
_cls();
_display_callers();
_break;
_case('V');
_cls();
_goto_display_version();
_break;
_default;
_printf("\n\nThat is NOT a valid command.\n");
_printf("Press any key to continue . . .");
_getc(ch,0);
_break;
_send;
_wend;
_pend;
Osiris SE Technical Reference Manual Page 484
File Subsystem
Assuming the caller selected 'F' from the main_menu
procedure, indicating a desire to enter the file system.
We used a procedure call to a procedure named
"file_area", e.g.,
_case('F');
_call(file_area);
_break;
The file subsystem construction process is almost, to
the letter, identical to the main_menu. Because it is
nearly identical, except for commands, I'll list the
entire procedure then touch on what is different.
_procedure(file_area);
_define_var(not_done,integer);
_define_var(ch,character);
_define_var(empty_queue,integer);
_assign(not_done,1);
_while(not_done);
_cls();
_command_queue_status(empty_queue);
_if(empty_queue);
_elseif(_ANSI);
_printf("File Area %d . . . %s\n",_FAREA#,_FAREA_N);
_else;
_printf("File Area %d . . . %s\n",_FAREA#,_FAREA_N);
_eend;
_display_menu("YFGKVAELQPTNSCD*M","filarea");
_elseif(_ANSI);
_printf("Time on: %d Time remaining %d Command ? ",_CALLTIME,_TIMELEFT);
_else;
_printf("Time on: %d Time remaining %d Command ? ",_CALLTIME,_TIMELEFT);
_eend;
_endif;
_get_ctrled_input(ch,"YAFGKV/ELQPTNSCD*M");
_switch(ch);
_case('Y');
_cls();
_transfer_stats();
_break;
_CASE('A');
_change_file_area();
_break;
Osiris SE Technical Reference Manual Page 485
_case('/');
_putc('/');
_call(process_slash);
_break;
_case('G');
_goto_log_off();
_break;
_case('M');
_clear(not_done);
_break;
_case('*');
_goto_msg_center();
_break;
_case('D');
_download();
_break;
_case('C');
_push_into_queue("P");
_clear(not_done);
_break;
_case('S');
_search_for_file();
_break;
_case('N');
_sprint("\n\n");
_run_newuploads_scan();
_break;
_case('T');
_sprint("\n\n");
_type_text_file();
_break;
_case('P');
_select_protocol();
_break;
_case('Q');
_sprint("\n\n");
_quick_file_list();
_break;
Osiris SE Technical Reference Manual Page 486
_case('L');
_sprint("\n\n");
_full_file_list();
_break;
_case('E');
_sprint("\n\n");
_extract_file();
_break;
_case('V');
_sprint("\n\n");
_view_archive();
_break;
_case('K');
_sprint("\n\n");
_Kill_file();
_break;
_case('F');
_cls();
_edit_queue();
_break;
_default;
_printf("\n\nThat is NOT a valid command.\n");
_printf("Press any key to continue . . .");
_getc(ch,0);
_break;
_send;
_wend;
_pend;
The only case label that is really different is
_case('C');
_push_into_queue("P");
_clear(not_done);
_break;
C takes you directly to the Conference area, bypassing
the main menu or at least everyone thinks it does. If
the truth be known, and it is now, it does not bypass
the main menu, it simply bypass' the main menu DISPLAY.
By stuffing "P" into the Osiris command stacking queue,
the main menu display screen will be skipped, the input
command _get_ctrled_input will retrieve the 'P' from the
queue and drop the caller into the conference system.
Osiris SE Technical Reference Manual Page 487
Why can't you call it directly, after all it is a
procedure.
You could except for one thing. The conference system
lets you jump back to the file area.
E.g.,
You jump from the File Area to the Conference area
_CALL(MSG_SYSTEM);
You jump from the conference area to the file area
_CALL(FILE_AREA);
You jump back to the conference area
_CALL(MSG_SYSTEM);
Nothing wrong with that, BUT you have never returned
from the FIRST call to the conference area and here you
are calling it again and again and again .... you're
also doing the same thing to the file_area procedure.
In a round about way, you are using recursion. Recursion
means having a procedure call itself. SPL/I does
support recursive calls, but you have a limited amount
of stack space and each recursive call can chew into
that. When you run out, your program crashes. Just how
many times can you make recursive calls? I really don't
know, I've never tried to max it out. My guess would be
enough times to get almost any job done that benefits
from or needs recursion to work.
The limited stack space is not a SPL/I restriction, it
is the way PC's handle things. Main frames use an
expandable stack, when the application needs more stack
space, the operating system simply allocates more to the
program.
PC's allocate a fixed amount of stack space to the
program. Exceed it and the program crashes.
Osiris SE Technical Reference Manual Page 488
The other case label that is different
_case('M');
_clear(not_done);
_break;
M, goto main menu, simply clears the not_done variable,
sets it to 0, the while expression evaluates false, the
loop terminates, end of procedure (Pend) is encountered
and you return to the main_menu procedure.
The last of our three primary menus is the conference
system. It is accessed by the main menu command
_case('P');
_call(msg_area);
_break;
And like the file_area procedure, it is identical in
respects to how it should be setup. I'll display the
entire procedure and point out what is different.
_procedure(msg_area);
_define_var(not_done,integer);
_define_var(ch,character);
_define_var(empty_queue,integer);
_assign(not_done,1);
_while(not_done);
_cls();
_command_queue_status(empty_queue);
_if(empty_queue);
_display_menu("PEAGSRMFC!","msgarea");
_elseif(_ANSI);
_printf("Time on: %d Time remaining %d Command ? ",_CALLTIME,_TIMELEFT);
_else;
_printf("Time on: %d Time remaining %d Command ? ",_CALLTIME,_TIMELEFT);
_eend;
_endif;
_get_ctrled_input(ch,"PEAGSRMFC!/");
_switch(ch);
_case('/');
_putc('/');
_call(process_slash);
_break;
Osiris SE Technical Reference Manual Page 489
_case('G');
_goto_log_off();
_break;
_case('M');
_clear(not_done);
_break;
_case('F');
_push_into_queue("F");
_clear(not_done);
_break;
_case('E');
_enter_message();
_break;
_case('P');
_sprint("\n\n");
_pack_messages();
_break;
_case('R');
_cls();
_read_messages();
_break;
_case('A');
_change_msg_areas();
_break;
_case('C');
_edit_conf_boards();
_break;
_case('!');
_goto_msg_center();
_break;
_case('S');
_cls();
_run_newmail_scan();
_break;
_default;
_printf("\n\nThat is NOT a valid command.\n");
_printf("Press any key to continue . . .");
_getc(ch,0);
_break;
_send;
_wend;
_pend;
Osiris SE Technical Reference Manual Page 490
The only thing here is
_case('F');
_push_into_queue("F");
_clear(not_done);
_break;
It works like the 'C' command in the file_area procedure
except it pushes 'F' into the command stacking queue.
Press_return
All of our primary procedures call the press_return
procedure to print the text "Press [RETURN] to Continue"
and then pauses until the caller presses return, or any
other key.
The procedure is fairly straight forward and really
doesn't need any explanation so I'll just list it.
_procedure(press_return);
_define_var(ch,character);
_elseif(_ANSI);
_printf("\nPress [RETURN] to continue . . .");
_else;
_printf("\nPress [RETURN] to continue . . .");
_eend;
_getc(ch,1);
_printf("\r \r");
_pend;
Process_slash
The last procedure we have to setup is process_slash.
Let me show it to you and then explain why I did it this
way.
Osiris SE Technical Reference Manual Page 491
_procedure(process_slash);
_define_var(s1,string(81));
_define_var(rtcode,integer);
_define_var(str,string(9));
_gets(str,8);
_elseif(str = "off");
_drop_carrier();
_else;
_elseif(str = "TNT");
_cls();
_sprintf(s1,"tntbbs -B %d -P %d -N %d",_BRATE,_PORT,_NODE);
_execute(640,s1,rtcode);
_else;
_elseif(str = "Osiris");
_push_into_queue("SE302?.ARJ");
_cls();
_global_download();
_else;
_elseif(str = "Isis");
_push_into_queue("I600?.ARJ");
_cls();
_global_download();
_else;
_printf("\n\a");
_eend;
_eend;
_eend;
_eend;
_pend;
The actual slash commands, what they do, isn't that
important, but the WAY you process them is.
You COULD simply have done
_gets(string,8);
_spawn(string);
But, that is very deadly.
If the caller types in /AUX or /COM1, or /PRN, and
several other DOS DEVICE names, your computer will
lockup when those devices are opened.
If you are going to use the spawn method, you will HAVE
to check to the contents of string BEFORE you call
spawn. You'll have more "OVERHEAD" and you'll use more
diskspace.
Osiris SE Technical Reference Manual Page 492
Wrap Up
That wraps up our little "roll your own bbs" section.
The program we wrote will emulate what you would
normally get WITHOUT using the autoexec.prg file.
It wouldn't make much sense to do an autoexec.prg if you
were just going to EMULATE what is already there, but
this should give you some idea as to what would be
involved in setting up your own.
Let you imagination run wild and I'm sure you could come
up with a fairly unique system.
It might be very complex with dozens of subsystems.
You might want to combine all the features into one main
menu.
You can make dozens of different STYLE BBS' and let the
caller pickout which style best suits his or her needs.
Your imagination is the only limit.
Tip
Don't use one command file for both ANSI and NON-
ANSI callers. It is much simpler to use a command file
for ANSI and one for NON-ANSI.
Not only is it simpler, but it is a lot faster because
you can do away with all of those _IF(_ANSI)
expressions.
I'd use ANSI.PRG and ASCII.PRG as the command files and
set-up autoexec.prg to do this;
_IF(_ANSI);
_SPAWN("E:\ANSI.PRG");
_ENDIF;
_SPAWN("E:\ASCII.PRG");
_Mend;
Since you'll never return to the original AUTOEXEC.PRG
after you spawn to the correct command file, you don't
have to use the ELSEIF.
Osiris SE Technical Reference Manual Page 493
Spl/I Source Files
The BBS, Vetlink III, has a special file area called
"SPL/I SOURCE FILES".
This directory contains varies SPL/I source archives
that you can download and use, generally without
modifications.
The area contains simple command files to very complex
information retrieval systems with hundreds of sub
levels and hundreds of thousands of bytes in multiple
cross indexed databases.
Speed Tip
The speed of a SPL/I command file is influenced by the
speed of your harddrive. The faster the drive, the
faster the command file will run.
I suggest, strongly, that you create an extended memory
or expanded memory RAM disk and run your ANSI.PRG and
ASCII.PRG from the RAM disk.
If you can't set-up a RAM disk, at least use a disk
cache.
Osiris SE Technical Reference Manual Page 494
File Structures
The following file structures are copyrighted by
International TeleCommunciations. You are granted a LIMITED
license to use the following structures in OSIRIS related
programs ONLY.
Using the following structures, in part or whole, for non-
Osiris related programs is forbidden under United States
Copyright laws.
Struct _Hdrxxxxx{/* first record in each HDRx.SYS file,
Conference
Headers only. */
char unused[36];
char unused1[36];
char unused2[40];
char unused3[20];
unsigned highmsg; /* Highest message number */
unsigned active_msgs; /* Number of NON-Deleted Msgs */
unsigned lowmsg; /* Low message number */
unsigned highwater; /* Can be used by Export programs
to log last message exported */
unsigned max_msgs; /* Maximum messages allowed in area*/
unsigned min_msgs; /* Post Pack Level */
unsigned empty3;
unsigned unused4;
unsigned unused5;
unsigned unused6;
unsigned unused7;
long unused8;
long unused9;
unsigned long unused10;
unsigned long unused11;
};
Osiris SE Technical Reference Manual Page 495
NOTE: Actual Message Headers start with the second record.
The first record is reserved for infoxxxxx.
Struct _Message_header/* (Conference Header, HDRx.SYS ) */
{
char from[36];
char to[36];
char subj[40];
char date[20];
int external1;/* For external Echomail Processors*/
int external2; /* For External Echomail Processors*/
int external3; /* For External Echomail Processors*/
int external4; /* For External Echomail Processors*/
int external5; /* For External Echomail Processors*/
unsigned date_received; /* Packed Date field, When
Message Was Received */
unsigned time_received; /* Packed Time Field, When
Message Was Received */
unsigned down_thread; /* Current msg is a reply to
this msg number */
unsigned attr; /* Attribute (behavior)
of the message */
unsigned up_thread; /* Next message in the thread*/
unsigned board; /* Message Board message is
assigned to */
long offset; /* offset address in msgtxt.qbs
pointing to start
of the message text;*/
long byte; /* number of bytes in message */
unsigned crc; /* 16 byte CRC for Msg Header */
unsigned eid_date; /* Packed date field, when message
was entered */
unsigned eid_time; /* Packed Time field, when message
was entered */
unsigned extern6; /* For external Echomail Processors*/
};
Conference Message Attributes
#define HAVE_READ 0x0001 /* Used by Sphinx * 0000 0000 0000 0001 */
#define MSGREAD 0x0004 /* read by addressee * 0000 0000 0000 0100 */
#define MSGDEL 0x0020 /* Msg has been deleted * 0000 0000 0010 0000 */
#define ORIGIN 0x0040 /* New Echo, Needs ORIGIN * 0000 0000 0100 0000 */
#define MSGECHO 0x0400 /* Unmoved Echomail * 0000 0100 0000 0000 */
#define DUPCHK 0x8000 /* Duplicate checked * 1000 0000 0000 0000 */
Osiris SE Technical Reference Manual Page 496
Struct _Keydef
{
unsigned char key[256]; /* keys the caller is allowed to
press */
};
NOTE: First Record in ACCESS.SYS is used as a place holder
only. Access level 1 starts is actually 2nd record in
ACCESS.SYS
Struct _Access_sys{
int timelimit_per_call[4];
int timelimit_per_day[4];
int download_limit[4];
int file_ratio[4];
int byte_ratio[4];
int time_give_back_ratio[4];
int byte_give_back_ratio[4];
unsigned flags;
/* 0x0001 = allow Passworded uploads
0x0002 = allow attach messages
0x0004 = allow KILL/Password
uploads
*/
};
Osiris SE Technical Reference Manual Page 497
Struct _User_record {
char name[36];
char city[26];
char pwd[16];
char homephone[13];
unsigned original_log_on_date; /* packed date
field */
unsigned last_date_online; /* packed date field */
unsigned total_calls;
unsigned char node_restrictor;
unsigned char allow_nodelist_display;
unsigned msg_areas[50]; /* areas selected */
unsigned high_msg_area; /* highest area
used */
unsigned highmsg[50]; /* high read in those
areas.*/
char alias[36];
char mailer_serial_number[51];
long ups; /* total Kbytes uploaded */
long downs; /* total kbytes downloaded */
char screen_clear_type; /* 1 = ANSI
2 = FORM FEED
3 = CR/LF */
int protocol; /* callers default protocol */
unsigned last_matrix_read; /* Highest file slot
used*/
int board; /*** Last Msg board accessed ***/
int fboard; /*** last File area access ***/
unsigned day; /*** birth day ***/
unsigned month; /*** birth month ***/
unsigned total_downloaded_files;
/* NUMBER of files downloaded */
unsigned total_uploaded_files;
/* NUMBER of files Uploaded */
int today; /*** downloads today...***/
int elapsed; /*** total time online
today..minutes...***/
int matrix_credit;
int times_posted;
unsigned menu_flags; /* special access flags for
command keys*/
unsigned last_time_online; /* packed time field */
unsigned access_level;
unsigned unused1;
unsigned unused2;
Osiris SE Technical Reference Manual Page 498
unsigned user_settings_flags;
/* Special user_settings flags
0000 0000 0000 000X Ansi 0x0001
0000 0000 0000 00X0 More On or OFF 0x0002
0000 0000 0000 0X00 Screen Clear 0x0004
0000 0000 0000 X000 [hotkeys] 0x0008
0000 0000 000X 0000 Full Menu display 0x0010
0000 0000 00X0 0000 No Menus..short display 0x0020
0000 0000 0X00 0000 No nothing, only SELECT: 0x0040
0000 0000 X000 0000 Auto mail check at log on 0x0080
*/
int use_ibm; /*** use IBM Graphic's *****/
int len; /***** Screen Length *****/
char unused3; /** resevered for system. **/
char osage_editor;
unsigned year; /* birth year */
unsigned new_upload_search_date;/* packed date
field */
unsigned download_prompt; /* 0 = off
1 = on */
unsigned rotate_password; /* 0 = 0ff
other number is number
of log-on's the
password is good for */
unsigned gflag; /* generally purpose SPL/I flags */
};
NOTE: User.idx, Alias.idx are properatory indexing systems.
Do not alter name field or alias field in user records.
Struct _Mainpriv{
char command_key[26];
int access_level[26];
unsigned flags[26];
};
Struct _Lastcaller {
char lastcaller[36];
char from[36];
};
Osiris SE Technical Reference Manual Page 499
Struct _Filboard
{
char command_key[20];/* command keys */
char name[31]; /* area name */
char downpath[80]; /* path to physical dnloadable files
in area*/
char down[80];/* path to files qbs for download area */
char uppath[80]; /* path to upload area */
unsigned access_level; /* area access level */
unsigned access_levels[20];/* access levels for command
keys*/
unsigned access_flags[20]; /* flags for command keys */
unsigned flag; /* area access flags */
char menu[9]; /* full help menu for area */
char dl_files[8]; /* name of download files.qbs, minus
extension */
char up_files[8]; /* name of upload files.qbs, minus
extension */
char bypass_limits; /* don't count downloads on user
record.
0 = count them.
1 = do not count them
*/
unsigned int app_flags;
char unused2[7];
};
Programmers Notes
The field app_flags consists of 16 bit flags.
External applications may use any one of the flags,
except bit flag 0, to indicate yes/no or on/off
switches for their applications. Before using one
of these flags, contact David Adams using our
technical support voice number to ensure that the
flag is not being used by another application.
Osiris SE Technical Reference Manual Page 500
Struct _Msgboard {
char command_key[20]; /* holds actual command key ascII
value */
unsigned access[20]; /* access levels for Command_key */
unsigned access_flags[20]; /* flags for command_key */
char name[31]; /* area name */ int type; /* area type */
int msg_type; /* message type */
int access_level; /* area access level */
unsigned flag; /* area access flags */
char origin[66]; /* optional origin line */
char menu[9]; /* name of menu minus extension */
char word_wrap; /* wordwrap on/off (1 = on, 0 = off) */
int upper_limit; /* maximum pre pack message level */
int lower_limit; /* post pack message level */
} ;
Struct _Filesbbs
{
char name[13];
unsigned upload_date; /* packed date field */
char description[81]; /* NOTE: Description must end with
ascii 10 and ascii 13 */
char upname[36]; /**** Person who uploaded the file ****/
unsigned times; /**** Number of times that files been
downloaded ****/
unsigned dl_date; /**** The last date that program was
downloaded ****/
};
Struct Protocol_rec{
char display_name[9];
char program_name[9];
char send_cmd[61];
char rcv_cmd[61];
long low_cps;
long high_cps;
long times_used;
int is_batch; /* 0 = No
1 = Yes
*/
unsigned access_level;
};
Osiris SE Technical Reference Manual Page 501
Struct _Msg_center_msg /* HDRP.SYS Header */
{
char from[36];
char to[36];
char subj[41];
unsigned date_posted; /* packed date field */
unsigned time_posted; /* packed time field */
unsigned date_received; /* packed date field */
unsigned time_received; /* packed time field */
unsigned attr; /* 0x0001 - Return Recite Requested */
/* 0x0002 - file attached */
long offset; /* offset in TXTP.SYS */
long bytes; /* No. bytes in Message */
char fname[13]; /* name of attached file */
int uplink; /* up link to next message in conversation
*/
int dnlink;/* down link to prior message in
conversation */
};
Struct _History_log
{
unsigned date; /* packed date field */
char name[36],
city[26];
int starting_hour,
starting_min,
ending_hour,
ending_min,
total_time; /* time online in minutes */
};
Packed Time Fields
A time field is packed using the same method DOS uses
for file dates.
Packed Date Fields
Packing A Date Field
int year,month,day;
<Get year,month, and day>
if(year > 1980) year -= 1980;
else
if(year > 80)
year -= 80;
pack_field = (year << 10) +(month << 5) + day;
Osiris SE Technical Reference Manual Page 502
Unpacking A Date Field
day = packed_date << 11 >> 11;
month = packed_date << 6 >> 11;
year = (packed_date >> 10) + 80;
Outxx.qbs
Outxx.Qbs is the external control file written by Osiris
when a caller does a VMS SHELL.
xx is the NODE number and should NOT be confused with
the COM port being used.
Filename for Node 1 - Out1.Qbs
Filename for Node 2 - Out2.Qbs
External applications can ALWAYS find the External
Control file by using the environment variable
OSIRIS=Drive:\path
The OUTxx.QBS will always be written in this directory.
e.g. OSIRIS=C:\Osiris
OUTxx.Qbs is in the directory C:\Osiris
Struct _Outctl /* outXX.qbs file */
{
char name[36]; /* callers name */
int internal_field1; /* Internal Osiris Use ONLY */
int elapsed; /* minutes ALREADY online TODAY */
int cur_baud; /* baud rate: 1200, 2400, 9600 */
int port; /* com port: 0, 1, 2, etc.. */
long timeleft; /* Time left for call in TIC's */
long logon_time; /* Log on time in TIC's */
int minutes; /* Minutes left for call */
int ansi; /* ANSI supported */
int local; /* 1 if in local mode */
int internal_field2; /* internal Osiris Use Only */
char sysop_name[36];
char board_name[40];
int node; /* Node number, 1 - 256 */
int ibm;/* Supports IBM Character Set 1 = Yes, 0 = No */
int user_id;/* User's Record Number */
int osage;/* Supports Osage ANSI Editor */
char phone[15]; /* Callers Phone Number */
char pwd[16]; /* Callers Password */
unsigned access_level; /* Callers Access Level 1-32722 */
int internal_field3; /* Osiris Internal Use Only */
};
Osiris SE Technical Reference Manual Page 503
Programming Notes
All String Fields are C NULL terminating strings.
Their MAY be resident garbage behind the NULL. That
garbage should be ignored.
Node Number does NOT reference the COM port being
used. Node 1 can be on COM port 2, 3, 4, 5, etc.
COM port being used should be pulled from the
"port" variable.
Baud rate reflects the CONNECT rate, and may NOT
always reference the serial rate, especially if the
system is running a highspeed modem locked at a
specific baud rate.
Programmers SHOULD check for an environment
variable COMx=BAUD_RATE with x being the COM
port in question. This will always, if it
exists, reflect the serial port baud rate, most
generally locked at a high baud rate.
e.g. COM2=19200
Indicates that COM port 2 is set to 19200 baud.
e.g. COM1=9600
Indicates that COM port 1 is set to 9600 baud.
Since Osiris Supports Ultra high Lock rates, up to
115,200 baud, a LONG integer should be used to
store the setting.
If programming in C : long serial_rate;
serial_rate = (long) atol(env_string);
Programmers should take care NOT to change ANY
field within the OUTxx.QBS.